/************************************************************************************************
 *   深圳市摩西尔电子有限公司 @版本所有@
 *
 *   mian页面相关js
 *
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 陈小荟
 *      时间 : 2020.4.10
 *      内容 : 所有代码
 *************************************************************************************************/
/* exported ARY_SCREEN_COMTENT_DATA */
/* exported mc_file_load */
/* exported side_mod_btn_click */
/* exported side_box_btn_click */
/* exported side_screen_btn_click */
/* exported side_select_mod */
/* exported side_select_box */
/* exported side_select_screen */
/* exported wrap_side_display */
/* exported update_side_info */
/* exported mc_send_box_basic_date */
/* exported mc_refresh_hardware_connection */
/* exported side_btn_delete */
/* exported mc_side_pushpin */
/* exported mc_side_load_file */
/* exported delete_edit_box */
/* exported delete_edit_box_callback */
/* exported mc_iframe_popout */
/* exported mc_side_add */
/* exported mc_read_box_gamma */
/* exported mc_loading_wait */
/* exported mc_loading_wait_remove */
/* exported mc_refresh */
/* exported switch_language */
/* exported B_HARDWARE_STATE */
/* exported g_str_mod_hw_msg */
/* exported g_str_mod_level_msg */
/* exported g_str_mod_scan_msg */
/* exported g_str_mod_clr_msg */
/* exported g_str_mod_normol_msg */
/* exported g_str_disp_reg_item_json */
/* exported g_str_scan_reg_item_json */
/* exported g_str_disp_reg_list_json */
/* exported g_str_scan_reg_list_json */
/* exported mc_show_side_btn */
/* exported mc_get_vers_number */
/* exported mc_delete_side_btn */
/* exported mc_select_side_btn */
/* exported b_normal_data_change */
/* exported g_str_load_order */
/* exported g_mc_fn_callback */
/* exported g_str_ctrl_name */
/* exported g_str_trans_ctrl */
/* exported SELECT_SCREEN_NAME */
/* exported mc_add_list_choose */
/* exported mc_close_iframe_popout */
/* exported mc_data_recvcard */
/* exported mc_data_module */
/* exported mc_data_box */
/* exported mc_main_get_box_xml */
/* exported g_str_gamma_order */
/* exported g_str_gamma_card */
/* exported g_str_gamma_way */
/* exported g_b_boxmain_type */
/* exported mc_construct_set_popout */
/* exported g_obj_corr_rapid_data */
/* exported g_str_show_light_data */
/* exported g_str_screen_order */
/* exported g_str_screen_ctrl */
/* exported b_if_reset_port */
/* exported b_if_mass */
/* exported b_if_mirror */
/* exported g_str_tpl_param */
/* exported g_tpl_fn_callback */
/* exported mc_main_send_supplenment */
/* exported g_obj_hardware_gamma */
/* exported g_obj_pin_data_test */
/* exported obj_mod_get_WH_data */
/* exported b_box_set_type */
/* exported mc_update_add_page_popup_show_name */
/* exported g_obj_chip_mass_mirror */
/* exported g_mod_mass */
/* exported g_str_backup_order */
/* exported g_str_backup_ctrl */
/* exported g_str_backup_type */
/* exported obj_screen_data_box_dom */
/* exported obj_screen_data_outport */
/* exported g_str_chip_auto_bright_type */
/* exported init_ibtn_edit_layout */
/* exported click_out_close_ibtn_edit */
/* exported mc_sideitem_mousedown*/
/* exported g_funk_send_load*/
/* exported g_str_test_data*/
/* exported mc_main_init_side_event */
/* exported mc_main_init_side_unfold_text */
/* exported mc_click_side_ibtn_text */
/* exported mc_side_load_file_chg */
/* exported mc_update_screen_size */
/* exported b_insert_box_file */
/* exported mc_update_load_txt */


/* global get_cur_pos */
/* global mc_sdk_recvcard */
/* global mc_sdk_module */
/* global mc_ui_box */
/* global $ */
/* global layer */
/* global g_obj_lang */
/* global obj_lang_map */
/* global set_combo_val */
/* global mc_sdk_param */
/* global mc_ui_item_grp */
/* global update_lang_display */
/* global mc_create_update_page_lang */
/* global get_val_from_str_arr */
/* global mc_set_fold_panel_switch */
/* global mc_set_hardware_connection_library */
/* global mc_sdk_hardware_data */
/* global mc_sdk_get_vers_number */
/* global mc_main_load_msg */
/* global mc_layout_get_box_basic */
/* global mc_layout_lod_file */
/* global mc_ui_edit */
/* global mc_sdk_hw_box_gama */
/* global mc_sdk_hw_box_gamut */
/* global mc_send_box_bright_date */
/* global mc_sdk_apply_box */
/* global g_obj_icon_btn */
/* global mc_construct_side_btn_layout */
/* global mc_ui_logger */
/* global mc_construct_icon_btn */
/* global mc_istouch */
/* global g_obj_side_icon_text */
/* global mc_load_file_onclick */
/* global G_OBJ_ROUTER_PAGE */
/* global mc_layout_get_box_size */


/*globals STR_PAGE_PATH:true*/

// 当前是否在更新硬件连接信息 true更新
// eslint-disable-next-line no-unused-vars
localStorage.setItem("B_UPDATE_REGRESH", true);
var B_UPDATE_REGRESH = true;
// 判断是否存在touch事件
var B_ISTOUCH = mc_istouch();

// 箱体链接数据源
var ARY_BOX_DATA = [];
// 模组数据源
var ARY_MOD_DATA = [];
// 大屏数据源
var ARY_SCREEN_DATA = [];
var ARY_SCREEN_COMTENT_DATA = [];
// 侧边箱体数据源
var ARY_SIDE_BOX_DATA = [];
// 侧边模组数据源
var ARY_SIDE_MOD_DATA = [];
// 当前所有使用模组名
var ARY_USE_MOD_NAME = [];
// 转换完成的模组/箱体/大屏数据源
var ARY_FM_MOD_DATA = [];
var ARY_FM_BOX_DATA = [];
var ARY_FM_SCREEN_DATA = [];
// 编辑跳转模组下标记录
var UI_EDIT_JUMP = -1;

// 弹出层下标
var ui_layer_index = -1;
// 获取数据初始化页面
var obj_mod_item_grp = new mc_ui_item_grp();

// 模组/箱体
var str_type_id = "";
var ui_mod_total_pages_len = 0;
var ui_box_total_pages_len = 0;
var ui_screen_total_pages_len = 0;

// 当前模组/箱体/大屏
var ui_mod_cur_page = 0;
var ui_box_cur_page = 0;
var ui_screen_cur_page = 0;
// 创建多个模组记录
var ui_mod_load_cur_page = ui_mod_cur_page;

// 是否创建内容块
var b_create_mod = false;
var b_create_box = false;
var b_create_screen = false;

// 是否在箱体/模组/常规页
var B_BOX_PAGE = false;
var B_MOD_PAGE = false;
var B_MAIN_PAGE = false;

// 保存上次点击右侧块名
var str_prev_side_name = "";
// 保存当前打开侧边按钮对象
var arr_open_side_item = [];

// 当前选中的模组名箱体名
// eslint-disable-next-line no-unused-vars
var SELECT_MOD_NAME = "";
var SELECT_BOX_NAME = "";
var SELECT_SCREEN_NAME = "";

// 存储侧边箱体数据 中英转换创建使用
var ary_side_box_data = [];
// 模组界面下常规参数数据
var g_str_mod_normol_msg = "";

// 判断常规界面是否有变化
var b_normal_data_change = false;
// 命令
var g_str_load_order = "";
var g_mc_fn_callback = function () { };
// 判断当前寄存器是否修改值
var g_b_modify_reg = false;
// gamma 命令
var g_str_gamma_order = "";
var g_str_gamma_card = "";
var g_str_gamma_way = "";
// boxmain 指令
var g_b_boxmain_type = "";
// 全局主控芯片名称
var g_str_ctrl_name = "T6";
// 临时全局主控芯片名称 用于显示接收卡类型
// var g_str_temp_ctrl_name = "T6";
// 用于传值
var g_str_trans_ctrl = null;

// 存矫正界面快速校正数据
var g_obj_corr_rapid_data = {
    arr_tbl_data: ["1", "0", "0", "1", "0", "0", "1", "0", "0"],
    b_gamut_switch: false
    // hw_data:''
};
// 存显示控制界面亮度数据
var g_str_show_light_data = "(100:100:100)";

// 大屏界面操作指令和芯片
var g_str_screen_order = null;
var g_str_screen_ctrl = null;
// 发送卡端口/HUB卡备份
var g_str_backup_order = null;
var g_str_backup_ctrl = null;
var g_str_backup_type = null;

// 定义大屏连接界面是否重置网口
var b_if_reset_port = false;
// 定义大屏连接界面是否群发
var b_if_mass = false;
// 定义大屏连接界面是否镜像
var b_if_mirror = false;

// 重新计算 箱体连接
var b_if_recaculate = false;

// 标识大屏是否计算结果
var b_if_use_congulate = false;

//  是否进行大屏保存
var b_save_screen = false;

// 保存重新计算的接收卡数据
var obj_congulate_device_data = {};

// 用于重新计算过滤筛选备份状态
// var b_congulate_fill_backup = true;

// 模板参数页面回调函数及传回参数
var g_str_tpl_param = "";
var g_tpl_fn_callback = function () { };

// 记录亮度调节界面自动亮度类型
var g_str_chip_auto_bright_type = null;

// 记录显示控制界面发送至发送卡接收卡 "0" 发送卡 / "1" 接收卡
var g_str_curr_send_location = "1";

// 记录硬件gamma数据保存
var g_obj_hardware_gamma = {
    "gray_bit": "12",
    "y_val": "65535",
    "factor": "2.80",
    "mode_val_idx": "1",
    "chart_type_name": "Calculate",
    "str_show_data": ""
};

// 用于模组箱体测试pin值的数据
var g_obj_pin_data_test = null;

// 用于获取箱体界面当前存在J箱体数据
var obj_mod_get_WH_data = {};
// 用于传箱体连接的类型
var b_box_set_type = null;

// 侧边显示名称
var g_obj_side_name = new construct_side_and_block_name();

// 用于显示控制界面保存当前群发和镜像数据
var g_obj_chip_mass_mirror = {
    b_mass: false,
    b_if_mirror: false
};

// 记录是否外部加载箱体
var b_insert_box_file = false;

// 巡检界面 获取大屏连接信息
var obj_screen_data_box_dom = {};
// 巡检界面 获取大屏主控分控图像信息
var obj_screen_data_outport = {
    "s_outport": "",
    "h_outport": "",
    "obj_offset": ""
};
// 大屏下发单个箱体的矫正数据
var obj_corr_offset = {};
// 使用hub按钮 针对大屏打开的校正界面
var b_corr_use_hub = true;
// 存巡检界面用的亮度数据/校正数据
var g_arr_inspect_light = ["100", "100", "100"];
var g_b_inspect_light = false;
var g_arr_inspect_gaumt = ["1", "0", "0", "0", "1", "0", "0", "0", "1"];

// 用于模组界面群发开关
var g_mod_mass = false;

// 用于存储点击发送按钮的数据
var g_funk_send_load = function () { };

// 用于测试异步发送的数据
var g_str_test_data = "";
var g_obj_log = new mc_ui_logger();
var g_obj_sendcard_data = new mc_sendcard_data();


/****************************************右侧栏相关函数*******************************************/
/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    创建模组块
 * 参数:
 *     @param { Promise<Boolean> } b_is_create true创建新模组
 *     @param { Promise<Number> } is_decide 若不更改当前选中模组为最新传递此参 否则为最新
 *     @param { Promise<Number> } ui_update_idx 当前更新项数据下标 可为空
 * 返回：
 *    @return { Promise<Boolean> }
 *     true 创建成功
 *     false 参数类型错误
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 陈小荟
 *      时间 : 2020.04.11
 *      内容 : 所有代码
 ************************************************************************************************/
function get_mod_info(b_is_create, is_decide, ui_update_idx) {
    if ("boolean" !== typeof b_is_create) {
        return false;
    }
    if (-1 !== UI_EDIT_JUMP) {
        ui_update_idx = UI_EDIT_JUMP;
    }
    // 定义当前模组下标
    var ui_cur_mod_idx = 0;
    var module_cnt = ARY_MOD_DATA.length;
    var b_continue_create = true;
    var str_side_show_name = "";

    b_create_box = false;
    b_create_screen = false;
    b_create_mod = true;
    if (module_cnt && 0 !== module_cnt) {
        if (b_is_create) {
            ui_mod_total_pages_len = module_cnt;
            if (ui_mod_load_cur_page + 1 < ui_mod_total_pages_len) {
                // 需要创建多个
                ui_cur_mod_idx = ui_mod_load_cur_page;
                ui_mod_total_pages_len = ui_cur_mod_idx + 1;
                ui_mod_load_cur_page = ui_mod_total_pages_len;
            } else {
                ui_cur_mod_idx = module_cnt - 1;
                if (!is_decide) {
                    ui_mod_cur_page = ui_cur_mod_idx;
                }
                b_continue_create = false;
            }

            str_side_show_name = set_total_pages("mc_side_mod", ui_mod_total_pages_len, is_decide);
        } else {
            // 更新
            if ("number" === typeof ui_update_idx || 0 === ui_update_idx) {
                ui_cur_mod_idx = ui_update_idx;
            } else {
                ui_cur_mod_idx = ui_mod_cur_page;
            }
            b_continue_create = false;
            ui_mod_total_pages_len = ui_cur_mod_idx + 1;
        }
        // 构建模组信息
        var obj_json = get_module(ui_cur_mod_idx);
        var mod_name = ARY_MOD_DATA[ui_cur_mod_idx].name;
        var str_json = construct_mod_info(obj_json);

        // 保存显示名称
        g_obj_side_name.set_name("MOD", mod_name, str_side_show_name);

        // 记录转换格式模组数据
        mc_save_fm_mod_data(mod_name, ui_cur_mod_idx, str_json, ARY_FM_MOD_DATA);

        if (!is_decide) {
            SELECT_MOD_NAME = mod_name;
        }
    } else {
        b_continue_create = false;
    }
    // 创建多个
    if (b_continue_create) {
        get_mod_info(true);
    }
    return true;
}


/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    创建箱体块
 * 参数:
 *     @param { Promise<Boolean> } b_is_create true创建新箱体
 *     @param { Promise<Object> } obj_json 箱体信息对象
 *     @param { Promise<Number> } is_decide 若不更改当前选中箱体为最新传递此参 否则为最新
 *     @param { Promise<Number> } ui_lang_chg 若为语言改变创建传递此参 当前更新项数据下标 否则不传递
 *     @param { Promise<Number> } ui_create_index 重复创建箱体 创建箱体当前下标
 *     @param { Promise<String> } str_file_name 加载文件name
 * 返回：
 *    @return { Promise<Boolean> }
 *     true 创建成功
 *     false 参数类型错误
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 陈小荟
 *      时间 : 2020.04.11
 *      内容 : 所有代码
 ************************************************************************************************/
function get_box_info(b_is_create, obj_json, is_decide, ui_lang_chg, ui_create_index, str_file_name) {
    if ("boolean" !== typeof b_is_create || "object" !== typeof obj_json) {
        return false;
    }
    var b_lang_chg = false;
    var str_side_show_name = "";

    if (0 === ui_lang_chg || "number" === typeof ui_lang_chg) {
        b_lang_chg = true;
    }
    // 定义当前模组下标
    var ui_cur_box_idx = 0;
    var module_cnt = ARY_BOX_DATA.length;

    if ("number" === typeof ui_create_index && !isNaN(ui_create_index)) {
        module_cnt = ui_create_index;
    }

    b_create_screen = false;
    b_create_mod = false;
    b_create_box = true;
    if (module_cnt && 0 !== module_cnt) {
        if (b_is_create) {
            if (b_lang_chg) {
                ui_box_total_pages_len = ui_lang_chg;
            } else {
                ui_box_total_pages_len = module_cnt;
                ui_cur_box_idx = module_cnt - 1;
                str_side_show_name = set_total_pages("mc_side_box", ui_box_total_pages_len, is_decide, str_file_name);
            }
            if (!is_decide) {
                ui_box_cur_page = ui_cur_box_idx;
            }
        } else {
            ui_cur_box_idx = ui_box_cur_page;
        }
        construct_mod_info(obj_json);
        var box_name = ARY_BOX_DATA[ui_cur_box_idx].name;

        // 保存显示名称
        g_obj_side_name.set_name("BOX", box_name, str_side_show_name);

        // 记录转换格式箱体数据
        mc_save_fm_mod_data(box_name, ui_cur_box_idx, JSON.stringify(obj_json), ARY_FM_BOX_DATA);
        // 语言改变创建时 不保存数据
        if (!ui_lang_chg) {
            mc_save_side_box_data(obj_json, ARY_SIDE_BOX_DATA, box_name, ui_cur_box_idx);
            ary_side_box_data.push(obj_json);
        }
        if (!is_decide) {
            SELECT_BOX_NAME = box_name;
        }
    }
    return true;
}


/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    创建大屏块
 * 参数:
 *     @param { Promise<Boolean> } b_is_create true创建新大屏
 *     @param { Promise<Number> } ui_lang_chg 若为语言改变创建传递此参为1 否则不传递
 *     @param { Promise<String> } str_file_name 加载文件name
 * 返回：
 *    @return { Promise<Boolean> }
 *     true 创建成功
 *     false 参数类型错误
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 陈小荟
 *      时间 : 2020.04.11
 *      内容 : 所有代码
 ************************************************************************************************/
function get_screen_info(b_is_create, ui_lang_chg, str_file_name) {
    if ("boolean" !== typeof b_is_create) {
        return false;
    }

    var ui_cur_screen_idx = 0;
    var module_cnt = ARY_SCREEN_DATA.length;
    var b_continue_create = true;
    var b_lang_chg = false;
    var str_side_show_name = "";

    if (0 === ui_lang_chg || "number" === typeof ui_lang_chg) {
        b_lang_chg = true;
    }

    b_create_mod = false;
    b_create_box = false;
    b_create_screen = true;
    if (module_cnt && 0 !== module_cnt) {
        if (b_is_create) {
            if (b_lang_chg) {
                ui_screen_total_pages_len = ui_lang_chg;
                ui_cur_screen_idx = ui_lang_chg - 1;
            } else {
                ui_screen_total_pages_len = module_cnt;
                ui_cur_screen_idx = module_cnt - 1;
                b_continue_create = false;
            }
            str_side_show_name = set_total_pages("mc_side_screen", ui_screen_total_pages_len, false, str_file_name);
        } else {
            ui_cur_screen_idx = ui_screen_cur_page;
            b_continue_create = false;
        }
        var obj_json = get_screen(ui_cur_screen_idx);

        construct_mod_info(obj_json);
        SELECT_SCREEN_NAME = ARY_SCREEN_DATA[ui_cur_screen_idx].name;
        ui_screen_cur_page = ui_cur_screen_idx;

        // 保存显示名称
        g_obj_side_name.set_name("SCREEN", SELECT_SCREEN_NAME, str_side_show_name);
        // 记录转换格式大屏数据
        mc_save_fm_mod_data(SELECT_SCREEN_NAME, ui_cur_screen_idx, JSON.stringify(obj_json), ARY_FM_SCREEN_DATA);
    }

    // 创建多个
    if (b_continue_create) {
        ui_lang_chg++;
        if (ui_lang_chg > module_cnt) {
            return true;
        }
        get_screen_info(true, ui_lang_chg);
    }
    return true;
}


/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    创建模组/箱体/大屏内容外框标签
 * 参数:
 *     @param { Promise<String> } id_name 内容外框div的class名
 *     @param { Promise<Number> } num 当前模组数
 *     @param { Promise<Number> } is_decide 是加载配置创建传递此参 否则为空
 *     @param { Promise<String> } str_file_name 加载文件name
 * 返回：
 *    @return { Promise<String> } str_show_name  === 在侧边显示的名称 || false === 参数类型错误
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 陈小荟
 *      时间 : 2020.04.11
 *      内容 : 所有代码
 *   2. 类型 : 添加
 *      作者 : 巫昭雯
 *      时间 : 2020.12.24
 *      内容 : 添加返回值 === 侧边显示的名称; 添加侧边折叠面板类
 ************************************************************************************************/
function set_total_pages(id_name, num, is_decide, str_file_name) {
    if ("string" !== typeof id_name || 0 === id_name.length || "number" !== typeof num) {
        return false;
    }
    var ui_sub = 0;

    if (b_create_screen) {
        ui_sub = 6;
    } else {
        ui_sub = 3;
    }
    var str_get_id = id_name.substring(id_name.length - ui_sub);
    var str_show_name = "";

    if (0 === $("#ui_" + str_get_id + num).length) {
        var str_html = "";
        var str_id = "";
        var mc_title_edit = new mc_ui_edit();
        var str_box_html = "";

        if (B_ISTOUCH) {
            str_box_html = "<div class='fold_panel_div side_fold_panel draw_open' onmousedown='mc_sideitem_mousedown(event,this)'><div class='mc_lable_name draw_title' style='background:none;display:flex;align-items:center;'>";
        } else {
            str_box_html = "<div class='fold_panel_div side_fold_panel draw_open' ontouchstart='mc_sideitem_mousedown(event,this)'><div class='mc_lable_name draw_title' style='background:none;display:flex;align-items:center;'>";
        }
        mc_title_edit.on_val_chg = side_title_edit_chg;
        mc_title_edit.set_add_css("side_edit");
        mc_title_edit.set_style_direction("left");
        mc_title_edit.set_style_width("76%");
        mc_title_edit.set_style_bordercolor("transparent");
        if ("mc_side_mod" === id_name) {
            // 内容项添加位置标识
            str_id = "ui_mod" + num;
            mc_title_edit.set_type("MOD");
            str_show_name = "MOD" + num;
            mc_set_title_val(mc_title_edit, "MOD" + num, str_file_name);
            str_html = str_box_html + mc_title_edit.get_html_txt() + "<i class='draw_angle icon-arrow-single-up'></i></div><div id='" + str_id + "' class='mc_fold_content side_mod_cont show_or_hide side_fold_cont' side_btn='" + num + "' style='display:none;'><div onclick='side_select_mod(this)'></div><div class='mc_fold_content_others'><div></div><div class='icon_btn_wrap_div flex_box_horizontal'><div id='mc_btn_mod_modify' class='icon-edit side_icon mc_test_side_modify' onclick='side_mod_btn_click(this);' lang_id='MC_LANG_EDIT'><div><span lang_id='MC_LANG_EDIT'></span></div></div><div  class='icon-delete side_icon mc_test_side_delete' onclick='side_btn_delete(this);' lang_id='MC_LANG_DELETE'><div><span lang_id='MC_LANG_DELETE'></span></div></div></div></div></div></div>";
        }
        if ("mc_side_box" === id_name) {
            str_id = "ui_box" + num;
            mc_title_edit.set_type("BOX");
            str_show_name = "BOX" + num;
            mc_set_title_val(mc_title_edit, "BOX" + num, str_file_name);
            str_html = str_box_html + mc_title_edit.get_html_txt() + "<i class='draw_angle icon-arrow-single-up'></i></div><div id='" + str_id + "' class='mc_fold_content side_box_cont show_or_hide side_fold_cont' side_btn='" + num + "' style='display:none;'><div onclick='side_select_box(this)'></div><div class='mc_fold_content_others'><div></div><div class='icon_btn_wrap_div flex_box_horizontal'><div  class='icon-edit side_icon mc_test_side_modify' onclick='side_box_btn_click(this);' lang_id='MC_LANG_EDIT'><div><span lang_id='MC_LANG_EDIT'></span></div></div><div   class='icon-delete side_icon mc_test_side_delete' onclick='side_btn_delete(this);' lang_id='MC_LANG_DELETE'><div><span lang_id='MC_LANG_DELETE'></span></div></div></div></div></div></div>";
        }
        if ("mc_side_screen" === id_name) {
            str_id = "ui_screen" + num;
            mc_title_edit.set_type("SCREEN");
            str_show_name = "SCREEN" + num;
            mc_set_title_val(mc_title_edit, "SCREEN" + num, str_file_name);
            str_html = str_box_html + mc_title_edit.get_html_txt() + "<i class='draw_angle icon-arrow-single-up'></i></div><div id='" + str_id + "' class='mc_fold_content side_screen_cont show_or_hide side_fold_cont' side_btn='" + num + "' style='display:none;'><div onclick='side_select_screen(this)'></div><div class='mc_fold_content_others'><div></div><div class='icon_btn_wrap_div flex_box_horizontal'><div class='icon-edit side_icon' onclick='side_screen_btn_click(this);' lang_id='MC_LANG_EDIT'><div><span lang_id='MC_LANG_EDIT'></span></div></div><div class='icon-delete side_icon' onclick='side_btn_delete(this);' lang_id='MC_LANG_DELETE'><div><span lang_id='MC_LANG_DELETE'></span></div></div></div></div></div></div>";
        }
        $("." + id_name).append(str_html);
        var o_mod = document.getElementById(str_id).parentNode;
        var arr_mod = o_mod.parentNode.children;

        if (!is_decide) {
            set_select_uniquity(arr_mod, o_mod);
        }
    }

    if (str_file_name) {
        return str_file_name;
    }
    return str_show_name;
    // return true;
}

/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    侧栏项title编辑框 chg响应函数
 * 参数:
 *     @param { Promise<String> } id 当前操作编辑框id
 *     @param { Promise<String> } val 当前操作编辑框val
 * 返回：
 *    NA
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 陈小荟
 *      时间 : 2020.10.9
 *      内容 : 所有代码
 *   2. 类型 : 修改
 *      作者 : 巫昭雯
 *      时间 : 2020.12.24
 *      内容 : 修改获取 side_btn 属性值代码; 添加更新侧边显示名;
 ************************************************************************************************/
function side_title_edit_chg(id, val) {
    var obj_edit = $("#" + id);
    var str_type = obj_edit.attr("mc_edit_type").toLocaleUpperCase();
    var str_side_btn = obj_edit.parents(".side_fold_panel").children(".side_fold_cont").attr("side_btn");
    var str_default_val = str_type + str_side_btn;
    var ui_cur_page = parseInt(str_side_btn, 10) - 1;

    val = val.trim();
    if (0 === val.length || str_default_val === val) {
        obj_edit.removeClass("non_default");
        obj_edit.text(str_default_val);
    } else {
        obj_edit.addClass("non_default");
    }

    if (0 !== val.length) {
        // 更新名称
        update_show_name_when_side_edit(str_type, ui_cur_page, val);
    }
}


/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    设置侧边栏项title
 * 参数:
 *     @param { Promise<object> } obj_edit 编辑框控件对象
 *     @param { Promise<String> } str_val 默认val
 *     @param { Promise<String> } str_file_val 加载文件name
 * 返回：
 *    @return { Promise<Boolean> }
 *     true 设置成功
 *     false 参数类型错误
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 陈小荟
 *      时间 : 2020.10.9
 *      内容 : 所有代码
 ************************************************************************************************/
function mc_set_title_val(obj_edit, str_val, str_file_val) {
    if ("[object Object]" !== Object.prototype.toString.call(obj_edit) || "[object String]" !== Object.prototype.toString.call(str_val)) {
        return false;
    }
    if (str_file_val) {
        obj_edit.set_val(str_file_val);
        // 标识非默认title
        obj_edit.set_add_css("non_default");
    } else {
        obj_edit.set_val(str_val);
    }
    return true;
}

/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    构造模组/箱体/大屏标签
 * 参数:
 *     @param { Promise<Object> } obj_json 信息对象
 * 返回：
 *    @return { Promise<Boolean> }
 *     true 创建成功
 *     false 参数类型错误
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 陈小荟
 *      时间 : 2020.04.11
 *      内容 : 所有代码
 ************************************************************************************************/
function construct_mod_info(obj_json) {
    if ("object" !== typeof obj_json) {
        return false;
    }
    var str_side_name = "";

    if (b_create_mod) {
        str_side_name = "#ui_mod" + ui_mod_total_pages_len;
    }
    if (b_create_box) {
        str_side_name = "#ui_box" + ui_box_total_pages_len;
    }
    if (b_create_screen) {
        str_side_name = "#ui_screen" + ui_screen_total_pages_len;
    }
    if ("" !== str_side_name && "" !== obj_json) {
        var str_json = JSON.stringify(obj_json);

        obj_mod_item_grp.set_lang_map(obj_lang_map);
        obj_mod_item_grp.set_rgb_combo_mode(set_combo_val(str_json, true));
        obj_mod_item_grp.set_max_col_cnt(1);
        obj_mod_item_grp.set_item_unit_width("0px");
        obj_mod_item_grp.set_json_txt(str_json);
        $(str_side_name).children().eq(0).html(obj_mod_item_grp.get_dom_html());

        // title msg
        var str_title = mc_get_sideitem_title(str_json);
        var obj_title = $(str_side_name).prev();

        if (0 !== str_title.length && obj_title.parent().hasClass("draw_open")) {
            obj_title.children().attr("title", str_title);
        }

        // 初始化折叠面板
        var obj_update_scroll = {
            page_id: "#mc_main_side",
            scroll_id: "#mc_wrap_div"
        };

        // eslint-disable-next-line no-new
        new mc_set_fold_panel_switch($(str_side_name).parents("#mc_wrap_div"), true, obj_update_scroll, true, mc_sideitem_dropdown_switch_title);

        if (str_side_name === "#ui_mod" + ui_mod_total_pages_len) {
            return str_json;
        }
    }
    // 若创建跳转 可不调用
    // update_lang_display();
    mc_create_update_page_lang();
    return true;
}

/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    构建侧边项title字串
 * 参数:
 *     @param { Promise<String> } str_json 侧边信息json串
 * 返回：
 *    @return { Promise<String> }
 *     "" 参数有误
 *     str_title
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 陈小荟
 *      时间 : 2020.04.28
 *      内容 : 所有代码
 ************************************************************************************************/
function mc_get_sideitem_title(str_json) {
    if ("[object String]" !== Object.prototype.toString.call(str_json)) {
        return "";
    }
    var str_title = "";
    var obj_sdk_param = new mc_sdk_param();
    var lin_break = "\r";

    obj_sdk_param.set_param_clear();
    obj_sdk_param.set_json(str_json);
    var ui_cnt = obj_sdk_param.get_param_cnt();

    for (var i = 0; i < ui_cnt; i++) {
        var str_key = obj_sdk_param.get_param_name(i);
        var str_val = obj_sdk_param.get_param_value(str_key);
        var str_transform_key = obj_lang_map[str_key];
        var str_transform_val = obj_lang_map[str_val];

        str_key = str_transform_key ? str_transform_key : str_key;
        str_val = str_transform_val ? str_transform_val : str_val;
        str_title += str_key + "：" + str_val + lin_break;
    }
    return str_title;
}

/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    侧栏项展开收起 切换title（显示隐藏title：展开不显示title信息，关闭显示）
 * 参数:
 *     @param { Promise<Object> } obj_jq title jq对象
 *     @param { Promise<Boolean> } b_pack_up 是否收起 true收起
 * 返回：
 *    @return { Promise<Boolean> }
 *     false 参数有误
 *     true 设置成功
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 陈小荟
 *      时间 : 2020.04.28
 *      内容 : 所有代码
 ************************************************************************************************/
function mc_sideitem_dropdown_switch_title(obj_jq, b_pack_up) {
    if ("[object Object]" !== Object.prototype.toString.call(obj_jq)) {
        return false;
    }
    if ("[object Boolean]" !== Object.prototype.toString.call(b_pack_up)) {
        return false;
    }
    // 清空拖拽添加参数
    clear_mov_param();
    if (b_pack_up) {
        var obj_inp = obj_jq.children(".mc_edit").children("input");
        var ui_digit = obj_inp.attr("default_digit");
        var str_type = obj_inp.attr("mc_edit_type");
        var arr_data = [];

        if ("mod" === str_type) {
            arr_data = ARY_FM_MOD_DATA;
        }
        if ("box" === str_type) {
            arr_data = ARY_FM_BOX_DATA;
        }
        if ("screen" === str_type) {
            arr_data = ARY_FM_SCREEN_DATA;
        }
        ui_digit = Number(ui_digit);
        var str_json = arr_data[ui_digit].data;

        obj_jq.children().attr("title", mc_get_sideitem_title(str_json));
    } else {
        obj_jq.children().removeAttr("title");
    }
    return true;
}

/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    更新侧边栏箱体/大屏信息内容
 * 参数:
 *     @param { Promise<Object> } obj_json 信息对象
 *     @param { Promise<Number> } ui_idx 当前更新箱体元素下标
 * 返回：
 *    @return { Promise<Boolean> }
 *     true 创建成功
 *     false 参数类型错误
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 陈小荟
 *      时间 : 2020.04.11
 *      内容 : 所有代码
 ************************************************************************************************/
function update_side_info(obj_json, ui_idx) {
    if ("object" !== typeof obj_json || "number" !== typeof ui_idx) {
        return false;
    }
    var str_side_name = "";
    var b_box_side_save = false;
    var obj_sdk_param = new mc_sdk_param();

    obj_sdk_param.set_param_clear();
    obj_sdk_param.set_json(JSON.stringify(obj_json));
    var ui_cnt = obj_sdk_param.get_param_cnt();

    if (3 < ui_cnt) {
        str_side_name = "#ui_box" + (ui_idx + 1);
        b_box_side_save = true;
    } else {
        str_side_name = "#ui_screen" + (ui_idx + 1);
    }

    if ("" !== str_side_name && "" !== obj_json) {
        var str_json = JSON.stringify(obj_json);

        obj_mod_item_grp.set_lang_map(obj_lang_map);
        obj_mod_item_grp.set_rgb_combo_mode(set_combo_val(str_json, true));
        obj_mod_item_grp.set_max_col_cnt(1);
        obj_mod_item_grp.set_item_unit_width("0px");
        obj_mod_item_grp.set_json_txt(str_json);
        $(str_side_name).children().eq(0).html(obj_mod_item_grp.get_dom_html());
        if (b_box_side_save) {
            // 更新箱体格式化数据
            mc_save_fm_mod_data(ARY_BOX_DATA[ui_idx].name, ui_idx, str_json, ARY_FM_BOX_DATA);
            mc_save_side_box_data(obj_json, ARY_SIDE_BOX_DATA, ARY_BOX_DATA[ui_idx].name, ui_idx);
            ui_box_cur_page = ui_idx;
        } else {
            // 更新大屏格式化数据
            mc_save_fm_mod_data(ARY_SCREEN_DATA[ui_idx].name, ui_idx, str_json, ARY_FM_SCREEN_DATA);
        }
    }
    return true;
}

/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    更新相关大屏大小信息
 * 参数:
 *     @param { Promise<String> } str_box_name 当前修改箱体name
 * 返回：
 *    @return { Promise<Boolean> }
 *     true 更新成功
 *     false 参数类型错误
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 陈小荟
 *      时间 : 2021.07.12
 *      内容 : 所有代码
 ************************************************************************************************/
function mc_update_screen_size(str_box_name) {
    // debugger;
    if ("[OBJECT STRING]" !== Object.prototype.toString.call(str_box_name).toUpperCase() || 0 === str_box_name) {
        return false;
    }
    // 需要更新大小大屏下标
    var arr_idx = [];
    var ary_screen_data = ARY_SCREEN_DATA;

    for (var i = 0; i < ary_screen_data.length; i++) {
        var obj_use_box_name = ary_screen_data[i].use_box_name;

        if ("[OBJECT OBJECT]" !== Object.prototype.toString.call(obj_use_box_name).toUpperCase()) {
            continue;
        }
        var arr_name = Object.keys(obj_use_box_name);

        for (var j = 0; j < arr_name.length; j++) {
            var str_item = arr_name[j];

            if (str_item === str_box_name) {
                var ary_box_size = mc_layout_get_box_size(str_box_name, ARY_BOX_DATA, ARY_MOD_DATA);
                var arr_data = obj_use_box_name[str_item];

                arr_idx.push(i);
                if ("[OBJECT ARRAY]" !== Object.prototype.toString.call(arr_data).toUpperCase()) {
                    continue;
                }
                // 更新箱体大小
                mc_update_screen_box_size(arr_data, ary_box_size);
            }
        }
    }
    for (var z = 0; z < arr_idx.length; z++) {
        var ui_idx = arr_idx[z];
        var o_screen_data = ary_screen_data[ui_idx];
        var obj_data = o_screen_data.use_box_name;

        var arr_screen_size = mc_compare_screen_size(obj_data);

        if (arr_screen_size) {
            o_screen_data.width = arr_screen_size[0];
            o_screen_data.height = arr_screen_size[1];
            // 更新侧边大屏项
            update_side_screen(ui_idx);
        }
    }
    return true;
}

/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    更新大屏中箱体大小信息
 * 参数:
 *     @param { Promise<Array> } arr_data 使用箱体数据
 *     @param { Promise<Array> } arr_size 更新箱体大小
 * 返回：
 *    @return { Promise<Boolean> }
 *     true 更新成功
 *     false 参数类型错误
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 陈小荟
 *      时间 : 2021.07.12
 *      内容 : 所有代码
 ************************************************************************************************/
function mc_update_screen_box_size(arr_data, arr_size) {
    if ("[OBJECT ARRAY]" !== Object.prototype.toString.call(arr_data).toUpperCase()) {
        return false;
    }
    if ("[OBJECT ARRAY]" !== Object.prototype.toString.call(arr_size).toUpperCase()) {
        return false;
    }
    for (var i = 0; i < arr_data.length; i++) {
        var obj_data = arr_data[i];

        obj_data.ui_width = arr_size[0];
        obj_data.ui_height = arr_size[1];
    }
    return true;
}

/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    计算大屏大小
 * 参数:
 *     @param { Promise<Object> } obj_data ARY_SCREEN_DATA -> use_box_name
 * 返回：
 *    @return { Promise<Array> }
 *     [ui_width,ui_height]
 *     null 参数类型错误
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 陈小荟
 *      时间 : 2021.07.12
 *      内容 : 所有代码
 ************************************************************************************************/
function mc_compare_screen_size(obj_data) {
    if ("[OBJECT OBJECT]" !== Object.prototype.toString.call(obj_data).toUpperCase()) {
        return null;
    }
    var arr_key = Object.keys(obj_data);
    var ui_min_x = Math.pow(2, 32);
    var ui_min_y = Math.pow(2, 32);
    var ui_max_x = 0;
    var ui_max_y = 0;

    for (var i = 0; i < arr_key.length; i++) {
        var arr_data = obj_data[arr_key[i]];

        for (var j = 0; j < arr_data.length; j++) {
            var obj_item = arr_data[j];

            if ("[OBJECT OBJECT]" !== Object.prototype.toString.call(obj_item).toUpperCase()) {
                continue;
            }
            var u_min_x = obj_item.ui_left;
            var u_min_y = obj_item.ui_top;
            var u_max_x = u_min_x + obj_item.ui_width;
            var u_max_y = u_min_y + obj_item.ui_height;

            if (ui_min_x > u_min_x) {
                ui_min_x = u_min_x;
            }
            if (ui_min_y > u_min_y) {
                ui_min_y = u_min_y;
            }
            if (ui_max_x < u_max_x) {
                ui_max_x = u_max_x;
            }
            if (ui_max_y < u_max_y) {
                ui_max_y = u_max_y;
            }
        }
    }
    return [Math.round(ui_max_x - ui_min_x), Math.round(ui_max_y - ui_min_y)];
}


/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    调用大屏更新侧边
 * 参数:
 *    @param { Promise<Number> } ui_idx 编辑跳转时传入查看大屏下标
 * 返回：
 *    @return { Promise<Boolean> }
 *     true 创建成功
 *     false 参数类型错误
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 陈小荟
 *      时间 : 2020.9.14
 *      内容 : 所有代码
 ************************************************************************************************/
function update_side_screen(ui_idx) {
    var u_idx = "[OBJECT NUMBER]" === Object.prototype.toString.call(ui_idx).toUpperCase() ? ui_idx : ui_screen_cur_page;
    var obj_json = get_screen(u_idx);

    update_side_info(obj_json, u_idx);
    return true;
}

/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    修改侧栏信息时跳转页面动作，当前选中项标识，跳转后收起右栏设置
 * 参数:
 *     @param { Promise<Object> } o_item 当前点击对象 修改按钮
 *     @param { Promise<Array> } arr_data 数据数组
 *     @param { Promise<Array> } str_url 跳转链接字串
 * 返回：
 *    @return { Promise<Array> }
 *     [当前选中项下标，当前选中项名] 设置成功
 *     [] 参数类型错误
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 陈小荟
 *      时间 : 2020.04.11
 *      内容 : 所有代码
 ************************************************************************************************/
function side_btn_amend(o_item, arr_data, str_url) {
    if ("object" !== typeof o_item || !(arr_data instanceof Array) || 0 === arr_data.length || "string" !== typeof str_url) {
        return [];
    }
    var o_data_item = o_item.parentNode.parentNode.parentNode;
    var ui_cur_page = parseInt(o_data_item.getAttribute("side_btn"), 10) - 1;
    var str_name = arr_data[ui_cur_page].name;

    STR_PAGE_PATH = str_url + str_name;
    update_lang_display();

    // 选中右栏当前修改模组
    var arr_mod = o_data_item.parentNode.parentNode.children;

    set_select_uniquity(arr_mod, o_data_item.parentNode);
    // 将侧边栏收起
    var str_pushpin = $(".add_side_width").attr("pushpin");

    if ("true" === str_pushpin) {
        $(".mc_wrap_div_side_cont").removeClass("add_side_width");
    } else {
        $(".mc_wrap_div_side_cont").removeClass("add_side_width", "set_pushpin");
        str_prev_side_name = "";
        mc_set_side_open_tip(arr_open_side_item);
        arr_open_side_item = [];
    }
    return [ui_cur_page, str_name];
}

/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    修改侧栏模组信息的相关设置
 * 参数:
 *     @param { Promise<Object> } obj 当前点击对象
 * 返回：
 *    @return { Promise<Boolean> }
 *     true 设置成功
 *     false 参数错误
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 陈小荟
 *      时间 : 2020.04.11
 *      内容 : 所有代码
 ************************************************************************************************/
function side_mod_btn_click(obj) {
    if ("object" !== typeof obj) {
        return false;
    }
    clear_mov_param();
    var str_url = "./pages/mod_wizard/mod_wizard.html?is_save=true&mod_name=";
    var arr_mod = side_btn_amend(obj, ARY_MOD_DATA, str_url);

    ui_mod_cur_page = arr_mod[0];
    SELECT_MOD_NAME = arr_mod[1];
    return true;
}

/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    修改侧栏箱体信息的相关设置
 * 参数:
 *     @param { Promise<Object> } obj 当前点击对象
 * 返回：
 *    @return { Promise<Boolean> }
 *     true 设置成功
 *     false 参数错误
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 陈小荟
 *      时间 : 2020.04.11
 *      内容 : 所有代码
 ************************************************************************************************/

function side_box_btn_click(obj,b_test) {
    clear_mov_param();
    // 侧栏编辑跳转常规页面
    var str_url = "./pages/box_main/box_main.html" + "?box_name=";

    // box_mian 进入箱体页面
    if ("string" === typeof obj) {
        var obj_parent = document.getElementById(obj);

        if (obj_parent) {
            obj = obj_parent.childNodes[0].childNodes[1].childNodes[0];
            str_url = "./pages/box_design/height_lever_layout.html?is_save=true" + "&box_name=";
            if (b_test) {
                str_url = "./pages/box_design/height_lever_layout_copy.html?is_save=true" + "&box_name=";
            }
        } else {
            mc_alert_popout("MC_LANG_POPOUT_NO_ADD_BOX");
        }
    }
    // 侧栏进入常规页面
    if ("object" !== typeof obj) {
        return false;
    }
    // var str_url = "./pages/box_design/height_lever_layout.html?is_save=true" + "&box_name=";
    // var arr_box = side_btn_amend(obj, ARY_BOX_DATA, str_url);
    var arr_box = side_btn_amend(obj, ARY_BOX_DATA, str_url);

    ui_box_cur_page = arr_box[0];
    SELECT_BOX_NAME = arr_box[1];
    return true;
}

/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    修改侧栏大屏信息的相关设置
 * 参数:
 *     @param { Promise<Object> } obj 当前点击对象
 * 返回：
 *    @return { Promise<Boolean> }
 *     true 设置成功
 *     false 参数错误
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 陈小荟
 *      时间 : 2020.04.11
 *      内容 : 所有代码
 ************************************************************************************************/
function side_screen_btn_click(obj) {
    if ("object" !== typeof obj) {
        return false;
    }

    var str_url = "./pages/box_design/height_lever_layout.html?enter=add_screen&is_save=true";
    var arr_mod = side_btn_amend(obj, ARY_SCREEN_DATA, str_url);

    ui_screen_cur_page = arr_mod[0];
    SELECT_SCREEN_NAME = arr_mod[1];
    return true;
}

// 当前删除的正在编辑箱体
var obj_delect_side_item = null;

/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    删除侧栏项
 * 参数:
 *     @param { Promise<Object> } obj 当前点击对象 删除按钮
 * 返回：
 *    @return { Promise<Boolean> }
 *     true 删除成功
 *     false 参数错误
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 陈小荟
 *      时间 : 2020.04.17
 *      内容 : 所有代码
 ************************************************************************************************/
function side_btn_delete(obj) {
    if ("object" !== typeof obj) {
        return false;
    }
    clear_mov_param();
    var o_side_cnt = $(obj).parent().parent().parent();
    var str_type = o_side_cnt.attr("id").substring(3, 4);
    var b_is_select = o_side_cnt.parent().hasClass("select_side_item");
    var i_index = 0;
    var str_select_data_name = "";
    var b_is_box = false;
    // 是否删除成功
    var b_delete_success = true;

    if ("b" === str_type) {
        i_index = parseInt(o_side_cnt.attr("side_btn"), 10);
        str_select_data_name = ARY_BOX_DATA[i_index - 1].name;
        b_is_box = true;
    }

    // 若当前删除的箱体页正在编辑 显示提示信息
    if (b_is_select && B_BOX_PAGE && b_is_box && str_select_data_name === SELECT_BOX_NAME) {
        var obj_popuot = {
            msg: "MC_LANG_POPOUT_BOX_DELECT",
            title: "MC_LANG_POPOUT_PROMPT",
            confirm_callback: "delete_edit_box",
            confirm_close: "delete_edit_box_callback"
        };

        obj_delect_side_item = obj;
        mc_confirm_popout(obj_popuot, true);
    } else {
        b_delete_success = mc_set_delete(obj);
    }

    // 若当前删除的模组页打开 跳转到常规
    if (b_delete_success && b_is_select && B_MOD_PAGE) {
        STR_PAGE_PATH = "./pages/box_main/box_main.html";
        update_lang_display();
        $(".mc_wrap_div_side_cont").removeClass("add_side_width");
        str_prev_side_name = "";
        mc_set_side_open_tip(arr_open_side_item);
        arr_open_side_item = [];
    }
    return true;
}

/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    删除侧栏某项
 * 参数:
 *     @param { Promise<Number> } ui_index 删除当前侧栏箱体某项下标
 *     @param { Promise<Sting> } str_type 选中类型 :mod/box/screen
 * 返回：
 *    @return { Promise<Boolean> }
 *     true 删除成功
 *     false 参数错误
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 陈小荟
 *      时间 : 2020.9.16
 *      内容 : 所有代码
 ************************************************************************************************/
function mc_delete_side_btn(ui_index, str_type) {
    if ("number" !== typeof ui_index || "string" !== typeof str_type || 0 === str_type.length) {
        return false;
    }
    var delect_item = $(".mc_side_" + str_type).children().eq(ui_index);

    if (delect_item) {
        var delect_btn = delect_item.children().eq(1).children().eq(1).children().eq(1).children().eq(1);

        if (delect_btn) {
            side_btn_delete(delect_btn[0]);
        }
    }
    return true;
}

/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    选中侧栏某项
 * 参数:
 *     @param { Promise<Number> } ui_index 选中项下标
 *     @param { Promise<Sting> } str_type 选中类型 :mod/box/screen
 * 返回：
 *    @return { Promise<Boolean> }
 *     true 选中成功
 *     false 参数错误
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 陈小荟
 *      时间 : 2020.9.18
 *      内容 : 所有代码
 ************************************************************************************************/
function mc_select_side_btn(ui_index, str_type) {
    if ("number" !== typeof ui_index || "string" !== typeof str_type || 0 === str_type.length) {
        return false;
    }
    var select_mod = $(".mc_side_" + str_type).children().eq(ui_index);

    if (select_mod) {
        select_mod = select_mod.children().eq(1).children().eq(0);

        if (select_mod) {
            if ("box" === str_type) {
                side_select_box(select_mod[0]);
                return true;
            }
            if ("mod" === str_type) {
                side_select_mod(select_mod[0]);
                return true;
            }
            if ("screen" === str_type) {
                side_select_screen(select_mod[0]);
                return true;
            }
        }
    }
    return true;
}

/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    当前删除的正在编辑箱体 弹框确定回调
 * 参数:
 *     无
 * 返回：
 *     无
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 陈小荟
 *      时间 : 2020.6.17
 *      内容 : 所有代码
 ************************************************************************************************/
function delete_edit_box() {
    STR_PAGE_PATH = "./pages/box_main/box_main.html";
    update_lang_display();
    $(".mc_wrap_div_side_cont").removeClass("add_side_width");
    str_prev_side_name = "";
    mc_set_side_open_tip(arr_open_side_item);
    arr_open_side_item = [];
}

/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    当前删除的正在编辑箱体 弹框确定关闭回调
 * 参数:
 *     无
 * 返回：
 *     无
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 陈小荟
 *      时间 : 2020.6.17
 *      内容 : 所有代码
 ************************************************************************************************/
function delete_edit_box_callback() {
    mc_set_delete(obj_delect_side_item);
    obj_delect_side_item = null;
}

/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    删除侧栏项相关设置
 * 参数:
 *     @param { Promise<Object> } obj 当前点击对象 删除按钮
 * 返回：
 *    @return { Promise<Boolean> }
 *     true 删除设置成功
 *     false 参数错误
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 陈小荟
 *      时间 : 2020.04.17
 *      内容 : 所有代码
 ************************************************************************************************/
function mc_set_delete(obj) {
    if ("object" !== typeof obj) {
        return false;
    }
    var o_side_data = $(obj).parent().parent().parent();
    var o_side_cnt = o_side_data.parent();
    var str_type = o_side_data.attr("id").substring(3, 4);
    var i_index = parseInt(o_side_data.attr("side_btn"), 10);
    var obj_side_box = o_side_cnt.parent();

    var ary_data = "";
    var str_id = "";
    var str_data_class = "";

    if ("m" === str_type) {
        ary_data = ARY_MOD_DATA;
        str_id = "ui_mod";
        str_data_class = ".side_mod_cont";
    }
    if ("b" === str_type) {
        ary_data = ARY_BOX_DATA;
        str_id = "ui_box";
        str_data_class = ".side_box_cont";
    }
    if ("s" === str_type) {
        ary_data = ARY_SCREEN_DATA;
        str_id = "ui_screen";
        str_data_class = ".side_screen_cont";
    }

    // 不允许删除当前正在使用模组
    if (ary_data === ARY_MOD_DATA) {
        var str_mod_name = ARY_MOD_DATA[i_index - 1].name;
        var b_remove = mc_remove_arr_data(str_mod_name, ARY_USE_MOD_NAME, false);

        if (!b_remove) {
            return false;
        }
        mc_data_dispose_remove_data(i_index - 1, ARY_FM_MOD_DATA);
        mc_data_dispose_remove_data(i_index - 1, ARY_SIDE_MOD_DATA);
    }

    // 删除箱体切换语言创建的数据
    if (ary_data === ARY_BOX_DATA) {
        var str_box_name = ARY_BOX_DATA[i_index - 1].name;

        // 删除箱体使用的模组数据
        mc_data_dispose_remove_data(i_index - 1, ary_side_box_data);
        mc_remove_arr_data(str_box_name, ARY_USE_MOD_NAME, true);
        // 删除箱体侧边数据源
        mc_data_dispose_remove_data(i_index - 1, ARY_SIDE_BOX_DATA);
        mc_data_dispose_remove_data(i_index - 1, ARY_FM_BOX_DATA);
    }

    // 移除选中项及数据处理
    o_side_cnt.remove();
    mc_data_dispose_remove_data(i_index - 1, ary_data);

    // 删除大屏侧边数据源
    if (ary_data === ARY_SCREEN_DATA) {
        mc_data_dispose_remove_data(i_index - 1, ARY_FM_SCREEN_DATA);
    }

    // data对象
    var arr_o_side = $(str_data_class);

    // 更改其他项标识
    update_other_tip();
    // for (var idx = 0; idx < arr_o_side.length; idx++) {
    //     var o_item = arr_o_side.eq(idx);
    //     var ui_index = idx + 1;
    //     var o_edit = o_item.parent().children().eq(0).children(".mc_edit").children("mc_edit_input");

    //     o_item.attr({
    //         "id": str_id + ui_index,
    //         "side_btn": ui_index
    //         // }).parent().children().eq(0).children().eq(1).text(ui_index);
    //     });
    //     if (!o_edit.hasClass("non_default")) {
    //         o_edit.attr("value", o_edit.attr("mc_edit_type") + ui_index);
    //     }
    // }


    var ui_select_idx = obj_side_box.children(".select_side_item").length;

    if (0 !== obj_side_box.children().length) {
        arr_o_side = obj_side_box[0].children;

        // 若选中项被删除
        if (0 === ui_select_idx) {
            // 删除项上一个存在选中
            if (0 !== $("#" + str_id + (i_index - 1)).length) {
                set_select_uniquity(arr_o_side, $("#" + str_id + (i_index - 1)).parent()[0]);
                // 更改当前选中模组或箱体名称
                update_select_name(str_id, ary_data[i_index - 2].name);
            } else if (0 !== $("#" + str_id + i_index.length)) {
                // 否则选中下一个
                set_select_uniquity(arr_o_side, $("#" + str_id + i_index).parent()[0]);
                update_select_name(str_id, ary_data[i_index - 1].name);
            }
        }

        // 当前最新选中项
        var obj_select = obj_side_box.children(".select_side_item");
        var ui_select_sur_idx = parseInt(obj_select.children().eq(1).attr("side_btn"), 10);

        // 更改当前选中项下标
        if ("m" === str_type) {
            ui_mod_cur_page = ui_select_sur_idx - 1;
        }
        if ("b" === str_type) {
            ui_box_cur_page = ui_select_sur_idx - 1;
        }
        if ("s" === str_type) {
            ui_screen_cur_page = ui_select_sur_idx - 1;
        }
    } else {
        // 删完操作
        if ("m" === str_type) {
            ui_mod_cur_page = -1;
            SELECT_MOD_NAME = "";
        }
        if ("b" === str_type) {
            ui_box_cur_page = -1;
            SELECT_BOX_NAME = "";
            // 箱体数据删完跳转回主页
            STR_PAGE_PATH = "./pages/box_index/box_index.html";
            update_lang_display();
        }
        if ("s" === str_type) {
            ui_screen_cur_page = -1;
            SELECT_SCREEN_NAME = "";
        }
    }

    return true;


    function update_other_tip() {
        for (var idx_other = 0; idx_other < arr_o_side.length; idx_other++) {
            var obg_item = arr_o_side.eq(idx_other);
            var u_index = idx_other + 1;
            var obj_edit = obg_item.parent().children().eq(0).children(".mc_edit").children("mc_edit_input");

            obg_item.attr({
                "id": str_id + u_index,
                "side_btn": u_index
                // }).parent().children().eq(0).children().eq(1).text(u_index);
            });
            if (!obj_edit.hasClass("non_default")) {
                obj_edit.attr("value", obj_edit.attr("mc_edit_type") + u_index);
            }
        }
    }
}

/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    更新当前选中模组或箱体名称
 * 参数:
 *     @param { Promise<String> } str_type 更改类型标识
 *     @param { Promise<String> } str_name 更改新名称
 * 返回：
 *    @return { Promise<Boolean> }
 *     true 更改成功
 *     false 参数错误
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 陈小荟
 *      时间 : 2020.04.18
 *      内容 : 所有代码
 ************************************************************************************************/
function update_select_name(str_type, str_name) {
    if ("string" !== typeof str_type || 0 === str_type.length || "string" !== typeof str_name) {
        return false;
    }
    if ("ui_mod" === str_type) {
        SELECT_MOD_NAME = str_name;
    }
    if ("ui_box" === str_type) {
        SELECT_BOX_NAME = str_name;
        // 在常规页 跳转对应数据常规页
        if (B_MAIN_PAGE && "" !== str_name) {
            STR_PAGE_PATH = "./pages/box_main/box_main.html";
            update_lang_display();
        }
    }
    if ("ui_screen" === str_type) {
        SELECT_SCREEN_NAME = str_name;
    }

    return true;
}

/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    保存当前格式化的侧边模组/箱体/大屏数据
 * 参数:
 *     @param { Promise<String> } str_mod_name 更改类型标识
 *     @param { Promise<String> } ui_mod_idx 更改新名称
 *     @param { Promise<String> } str_json 数据字串
 *     @param { Promise<Array> } arr_data 保存数据数组
 * 返回：
 *    @return { Promise<Boolean> }
 *     true 保存成功
 *     false 参数错误
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 陈小荟
 *      时间 : 2020.6.22
 *      内容 : 所有代码
 ************************************************************************************************/
function mc_save_fm_mod_data(str_mod_name, ui_mod_idx, str_json, arr_data) {
    if ("string" !== typeof str_mod_name || "" === str_mod_name.length || !(Array.isArray(arr_data))) {
        return false;
    }
    if ("string" !== typeof str_json || 0 === str_json.length || "number" !== typeof ui_mod_idx) {
        return false;
    }
    if (arr_data[ui_mod_idx]) {
        arr_data[ui_mod_idx].data = str_json;

        // 只添加title元素 情况
        if (!arr_data[ui_mod_idx].name) {
            arr_data[ui_mod_idx].name = str_mod_name;
        }
    } else {
        var obj = {
            name: str_mod_name,
            data: str_json
        };

        arr_data[ui_mod_idx] = obj;
    }
    return true;
}

// 点击侧边项
/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    点击侧边栏列表选中点击项
 * 参数:
 *     @param { Promise<Object> } o_item 当前点击对象 列表项内容部分
 *     @param { Promise<Array> } arr_data 数据数组
 * 返回：
 *    @return { Promise<Array> }
 *     [当前选中项name, 当前选中项在数据中位置下标]
 *     [] 参数错误
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 陈小荟
 *      时间 : 2020.04.21
 *      内容 : 所有代码
 ************************************************************************************************/
function side_select_click(o_item, arr_data) {
    if ("object" !== typeof o_item || !(arr_data instanceof Array) || 0 === arr_data.length) {
        return [];
    }
    var o_select_item = o_item.parentNode.parentNode;
    var o_list = o_select_item.parentNode.children;
    var ui_cur = parseInt(o_item.parentNode.getAttribute("side_btn"), 10) - 1;
    var str_name = arr_data[ui_cur].name;

    set_select_uniquity(o_list, o_select_item);
    return [str_name, ui_cur];
}

/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    点击侧边栏模组项更新当前选中项
 * 参数:
 *     @param { Promise<Object> } obj 当前点击对象
 * 返回：
 *    @return { Promise<Boolean> }
 *     true 更新成功
 *     false 参数错误
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 陈小荟
 *      时间 : 2020.04.21
 *      内容 : 所有代码
 ************************************************************************************************/
function side_select_mod(obj) {
    if ("object" !== typeof obj) {
        return false;
    }
    var arr_mod = side_select_click(obj, ARY_MOD_DATA);

    SELECT_MOD_NAME = arr_mod[0];
    ui_mod_cur_page = arr_mod[1];
    return true;
}

/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    点击侧边栏箱体项更新当前选中项,跳转对应常规页面
 * 参数:
 *     @param { Promise<Object> } obj 当前点击对象
 * 返回：
 *    @return { Promise<Boolean> }
 *     true 更新成功
 *     false 参数错误
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 陈小荟
 *      时间 : 2020.04.21
 *      内容 : 所有代码
 ************************************************************************************************/
function side_select_box(obj) {
    if ("object" !== typeof obj) {
        return false;
    }
    var arr_box = side_select_click(obj, ARY_BOX_DATA);

    SELECT_BOX_NAME = arr_box[0];
    ui_box_cur_page = arr_box[1];

    g_str_ctrl_name = ARY_BOX_DATA[0].data.mc_util_get_ui_box_msg().ctrlchip_name;
    var str_window_path = "./pages/mc_window/mc_window.html";
    var str_check_path = "./pages/check_mod/check_mod.html?add_choose=box";
    var str_box_path = "./pages/box_design/height_lever_layout.html?enter=add_screen";

    if ("./pages/mc_window/mc_window.html" === STR_PAGE_PATH.substr(0, str_window_path.length)) {
        // 连接卡页面不跳转
        return true;
    }
    if ("./pages/check_mod/check_mod.html?add_choose=box" === STR_PAGE_PATH.substr(0, str_check_path.length)) {
        // 选择页不跳转
        return true;
    }
    if ("./pages/box_design/height_lever_layout.html?enter=add_screen" === STR_PAGE_PATH.substr(0, str_box_path.length)) {
        // 大屏页不跳转
        return true;
    }
    STR_PAGE_PATH = "./pages/box_main/box_main.html";
    update_lang_display();
    return true;
}

/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    点击侧边栏大屏项选中当前
 * 参数:
 *     @param { Promise<Object> } obj 当前点击对象
 * 返回：
 *    @return { Promise<Boolean> }
 *     true 更新成功
 *     false 参数错误
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 陈小荟
 *      时间 : 2020.04.21
 *      内容 : 所有代码
 ************************************************************************************************/
function side_select_screen(obj) {
    if ("object" !== typeof obj) {
        return false;
    }
    var arr_box = side_select_click(obj, ARY_SCREEN_DATA);

    SELECT_SCREEN_NAME = arr_box[0];
    ui_screen_cur_page = arr_box[1];
    return true;
}

/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    获取模组信息
 * 参数:
 *     @param { Promise<Number> } idx_module 模组下标
 * 返回：
 *    @return { Promise<Boolean> }
 *     true -> {数据对象}
 *     false 参数错误
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 陈小荟
 *      时间 : 2020.04.21
 *      内容 : 所有代码
 ************************************************************************************************/
function get_module(idx_module) {
    if (!(Array.isArray(ARY_MOD_DATA)) || 0 >= ARY_MOD_DATA.length) {
        return false;
    }

    var str_mod_name = ARY_MOD_DATA[idx_module].name;
    var str_dispchip_name = "";
    var str_scanchip_name = "";
    var obj_sdk_module = ARY_MOD_DATA[idx_module].data;

    var obj_sdk_param = new mc_sdk_param();
    var ui_group_cnt = obj_sdk_module.mc_util_mod_get_str_grp_mode();

    ui_group_cnt = parseInt(ui_group_cnt, 10);
    obj_sdk_param.set_param_clear();

    var str_param_name = "MC_LANG_DISPCHIP_LIST";
    var str_param_value = obj_sdk_module.mc_util_mod_get_disp_chip();

    str_dispchip_name = str_param_value;

    obj_sdk_param.set_param_value(str_param_name, str_param_value);
    obj_sdk_param.set_attr_val(str_param_name, "UI_TYPE", "LABEL");
    str_param_name = "MC_LANG_SCANCHIP_LIST";
    str_param_value = obj_sdk_module.mc_util_mod_get_scan_chip();
    str_scanchip_name = str_param_value;
    obj_sdk_param.set_param_value(str_param_name, str_param_value);
    obj_sdk_param.set_attr_val(str_param_name, "UI_TYPE", "LABEL");
    var obj_rect = obj_sdk_module.mc_util_mod_get_img_rect(0, 0xffffffff);
    var ui_width = (obj_rect.u32_right + 1 - obj_rect.u32_left);
    var ui_height = (obj_rect.u32_bottom + 1 - obj_rect.u32_top);

    str_param_name = "MC_LANG_LABLE_WEITH";
    str_param_value = ui_width;
    str_param_value = str_param_value.toString();
    obj_sdk_param.set_param_value(str_param_name, str_param_value);
    obj_sdk_param.set_attr_val(str_param_name, "UI_TYPE", "LABEL");
    str_param_name = "MC_LANG_LABLE_HEIGHT";
    str_param_value = ui_height;
    str_param_value = str_param_value.toString();
    obj_sdk_param.set_param_value(str_param_name, str_param_value);
    obj_sdk_param.set_attr_val(str_param_name, "UI_TYPE", "LABEL");
    str_param_name = "MC_LANG_LABLE_TXGRP_CNT";
    var ui_txgrp_cnt = obj_sdk_module.mc_util_mod_get_str_cnt();

    if (1 !== ui_group_cnt) {
        ui_txgrp_cnt /= ui_group_cnt;
    }
    str_param_value = ui_txgrp_cnt;
    str_param_value = str_param_value.toString();
    obj_sdk_param.set_param_value(str_param_name, str_param_value);
    obj_sdk_param.set_attr_val(str_param_name, "UI_TYPE", "LABEL");
    str_param_name = "MC_LANG_LABLE_SCAN_CNT";
    str_param_value = obj_sdk_module.mc_util_mod_get_max_scan_cnt();
    str_param_value = str_param_value.toString();
    obj_sdk_param.set_param_value(str_param_name, str_param_value);
    obj_sdk_param.set_attr_val(str_param_name, "UI_TYPE", "LABEL");

    str_param_value = "3";
    if (str_dispchip_name) {
        str_param_value = obj_sdk_module.mc_util_mod_get_str_grp_mode() + "";
    }

    var obj_data = {
        name: str_mod_name,
        dispchip_name: str_dispchip_name,
        scanchip_name: str_scanchip_name,
        tx_grp_type: get_val_from_str_arr("1=MC_LANG_OPTION_STR_1_DSP,3=MC_LANG_OPTION_STR_3_DSP,4=MC_LANG_OPTION_STR_4_DSP", str_param_value),
        width: ui_width,
        height: ui_height
    };

    // 若存在 更新
    if (ARY_SIDE_MOD_DATA[idx_module]) {
        ARY_SIDE_MOD_DATA[idx_module] = obj_data;
    } else {
        ARY_SIDE_MOD_DATA.push(obj_data);
    }

    var str_ui_json = obj_sdk_param.get_json();

    return JSON.parse(str_ui_json);
}

/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    获取大屏信息
 * 参数:
 *     @param { Promise<Number> } idx_screen 大屏下标
 * 返回：
 *    @return { Promise<Boolean> }
 *     true -> {数据对象}
 *     false 参数错误
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 陈小荟
 *      时间 : 2020.9.29
 *      内容 : 所有代码
 ************************************************************************************************/
function get_screen(idx_screen) {
    if (!(Array.isArray(ARY_SCREEN_DATA)) || 0 >= ARY_SCREEN_DATA.length) {
        return false;
    }
    var obj_data = ARY_SCREEN_DATA[idx_screen];
    var obj_sdk_param = new mc_sdk_param();

    obj_sdk_param.set_param_clear();
    var str_param_name = "MC_LANG_LABLE_WEITH";

    obj_sdk_param.set_param_value(str_param_name, String(obj_data.width));
    obj_sdk_param.set_attr_val(str_param_name, "UI_TYPE", "LABEL");

    str_param_name = "MC_LANG_LABLE_HEIGHT";
    obj_sdk_param.set_param_value(str_param_name, String(obj_data.height));
    obj_sdk_param.set_attr_val(str_param_name, "UI_TYPE", "LABEL");

    str_param_name = "MC_LANG_BOX_COUNT";
    obj_sdk_param.set_param_value(str_param_name, String(obj_data.box_cnt));
    obj_sdk_param.set_attr_val(str_param_name, "UI_TYPE", "LABEL");

    var obj_json = JSON.parse(obj_sdk_param.get_json());

    return obj_json;
}

/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    右侧栏收展 内容切换
 * 参数:
 *     @param { Promise<Object> } obj 当前点击侧栏项 模组/箱体/大屏
 * 返回：
 *    @return { Promise<Boolean> }
 *     false 参数有误
 *     true 设置成功
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 陈小荟
 *      时间 : 2020.04.21
 *      内容 : 所有代码
 ************************************************************************************************/
function wrap_side_display(obj) {
    if ("object" !== typeof obj) {
        return false;
    }
    var str_is_decide = obj.getAttribute("is_decide");
    var o_new_item = {};
    // 头部列表文本
    var str_title_lang_id = "";
    var str_title_text = "";

    // 去除禁用移动展开效果
    if (0 !== $(".mc_wrap_div_side_cont").length) {
        $(".mc_wrap_div_side_cont").removeClass("set_pushpin");
    }

    if ("box" === str_is_decide) {
        str_type_id = "mc_side_box";
        o_new_item = $(".mc_side_box");
        str_title_lang_id = "MC_LANG_BOX_LIST";
        $("#load_file").css("display", "block");
    }
    if ("mod" === str_is_decide) {
        str_type_id = "mc_side_mod";
        o_new_item = $(".mc_side_mod");
        str_title_lang_id = "MC_LANG_MOD_LIST";
        $("#load_file").css("display", "none");
    }
    if ("screen" === str_is_decide) {
        str_type_id = "mc_side_screen";
        o_new_item = $(".mc_side_screen");
        str_title_lang_id = "MC_LANG_SCREEN_LIST";
        $("#load_file").css("display", "block");
    }
    if ("" !== str_title_lang_id) {
        str_title_text = g_obj_lang.get_item_val(str_title_lang_id);
    }
    // 切换
    if ({} !== o_new_item && str_prev_side_name !== str_is_decide) {
        var arr_o = o_new_item.parent().children();

        for (var idx = 1; idx < arr_o.length; idx++) {
            var o_item = arr_o.eq(idx);

            o_item.css("display", "none");
        }
        o_new_item.css("display", "block");
        // 头部标签切换
        $(".side_title").attr("lang_id", str_title_lang_id).text(str_title_text);
    }

    if ("" === str_prev_side_name || str_prev_side_name === str_is_decide) {
        var side_bar = $(".mc_wrap_div_side_cont");

        // 打开侧栏
        if (!side_bar.hasClass("add_side_width")) {
            $(".mc_wrap_div_side_cont").addClass("add_side_width");
            str_prev_side_name = str_is_decide;
            mc_set_side_open_tip(arr_open_side_item);
            arr_open_side_item = [];

            obj.classList.add("wrap_side_select_btn");
            arr_open_side_item.push(obj);
        } else {
            // 不固定收起
            $(".mc_wrap_div_side_cont").removeClass("add_side_width");
            str_prev_side_name = "";
            mc_set_side_open_tip(arr_open_side_item);
            arr_open_side_item = [];
        }
    } else {
        // 记录当前
        str_prev_side_name = str_is_decide;
        arr_open_side_item[0].classList.remove("wrap_side_select_btn");
        obj.classList.add("wrap_side_select_btn");
        arr_open_side_item[0] = obj;
    }
    box_page_get_focus();
    return true;
}

// 去除侧边按钮选中标识
function mc_set_side_open_tip(arr_side) {
    if (0 !== arr_side.length) {
        arr_side[0].classList.remove("wrap_side_select_btn");
    }
}

/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    固定/取消固定侧栏
 * 参数:
 *     @param { Promise<Object> } obj 当前点击对象 固定按钮
 * 返回：
 *    @return { Promise<Boolean> }
 *     true 设置成功
 *     false 参数错误
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 陈小荟
 *      时间 : 2020.04.21
 *      内容 : 所有代码
 ************************************************************************************************/
function mc_side_pushpin(obj) {
    if ("object" !== typeof obj) {
        return false;
    }
    var obj_side_parent = obj.parentNode.parentNode.parentNode;
    var str_status = obj_side_parent.getAttribute("pushpin");

    if ("false" === str_status) {
        obj_side_parent.classList.add("set_side_pushpin");
        obj_side_parent.classList.remove("mc_wrap_div_side_cont");
        $(".set_side_pushpin").children().eq(1).css("width", "100%");
        obj_side_parent.setAttribute("pushpin", true);
        obj.classList.add("select_side_item");
    } else {
        obj_side_parent.classList.remove("set_side_pushpin");
        obj_side_parent.classList.add("mc_wrap_div_side_cont");
        obj_side_parent.classList.add("set_pushpin");
        $(".mc_wrap_div_side_cont").children().eq(1).css("width", "46%");
        obj_side_parent.setAttribute("pushpin", false);
        obj.classList.remove("select_side_item");
    }
    return true;
}

/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    侧栏列表选中唯一项 添加唯一class类
 * 参数:
 *     @param { Promise<Array> } arr_list 点击项列表
 *     @param { Promise<Object> } o_select_item 当前需要选中项
 * 返回：
 *    无
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 陈小荟
 *      时间 : 2020.04.21
 *      内容 : 所有代码
 ************************************************************************************************/
function set_select_uniquity(arr_list, o_select_item) {
    for (var idx = 0; idx < arr_list.length; idx++) {
        var o_item = arr_list[idx];

        o_item.classList.remove("select_side_item");
    }
    o_select_item.classList.add("select_side_item");
}

/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    点击侧边添加 模组/箱体/大屏 切换页面
 * 参数:
 *    无
 * 返回：
 *    无
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 陈小荟
 *      时间 : 2020.04.21
 *      内容 : 所有代码
 ************************************************************************************************/
function mc_side_add() {
    STR_PAGE_PATH = "";
    if ("mc_side_mod" === str_type_id) {
        STR_PAGE_PATH = "./pages/mod_wizard/mod_wizard.html?is_save=false";
    }
    if ("mc_side_box" === str_type_id) {
        STR_PAGE_PATH = "./pages/box_design/height_lever_layout.html";
    }
    if ("mc_side_screen" === str_type_id) {
        STR_PAGE_PATH = "./pages/box_design/height_lever_layout.html?enter=add_screen";
        // STR_PAGE_PATH = "./pages/screen configuration/screen.html";
    }
    if ("" !== STR_PAGE_PATH) {
        update_lang_display();
    }

    // 将侧边栏收起
    var str_pushpin = $(".add_side_width").attr("pushpin");

    if ("true" === str_pushpin) {
        $(".mc_wrap_div_side_cont").removeClass("add_side_width");
    } else {
        $(".mc_wrap_div_side_cont").removeClass("add_side_width", "set_pushpin");
        str_prev_side_name = "";
        mc_set_side_open_tip(arr_open_side_item);
        arr_open_side_item = [];
    }
}

// 侧栏加载文件
/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    点击侧边加载文件 限制选择文件类型/触发选择文件
 * 参数:
 *    无
 * 返回：
 *    无
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 陈小荟
 *      时间 : 2020.9.29
 *      内容 : 所有代码
 *   1. 类型 : 添加
 *      作者 : 巫昭雯
 *      时间 : 2021-6-8
 *      内容 : 添加微信端判断 && input属性file_type值 && 阻止事件冒泡
 ************************************************************************************************/
function mc_side_load_file() {
    var str_side_type = $(".side_title").attr("lang_id");
    var obj_file_input = document.getElementById("mc_cfg_file_selector");

    // 加载箱体文件
    if ("MC_LANG_BOX_LIST" === str_side_type) {
        obj_file_input.setAttribute("accept", ".box-conf");
        obj_file_input.setAttribute("file_type", "BOX");
    }

    // 加载大屏文件
    if ("MC_LANG_SCREEN_LIST" === str_side_type) {
        obj_file_input.setAttribute("accept", ".src");
        obj_file_input.setAttribute("file_type", "SCREEN");
    }

    mc_load_file_onclick(obj_file_input);

    if (window.event.target && "INPUT" === window.event.target.tagName) {
        return;
    }

    obj_file_input.click();
}

/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    加载文件 change事件
 * 参数:
 *    @param { Promise<Object> } obj 触发对象
 * 返回：
 *    无
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 陈小荟
 *      时间 : 2020.9.30
 *      内容 : 所有代码
 ************************************************************************************************/
function mc_file_load(obj) {
    var str_type = obj.getAttribute("accept");

    if (".box-conf" === str_type) {
        mc_load_box_file(obj);
    }
    if (".src" === str_type) {
        mc_load_screen_file(obj);
    }
}

/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    加载箱体文件
 * 参数:
 *    @param { Promise<Object> } obj 触发对象
 * 返回：
 *    无
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 陈小荟
 *      时间 : 2020.9.30
 *      内容 : 所有代码
 ************************************************************************************************/
function mc_load_box_file(obj) {
    var dom_elem_file = obj;

    if (!dom_elem_file) {
        return;
    }

    if (!(dom_elem_file.files) || !(dom_elem_file.files[0])) {
        return;
    }

    var obj_file = dom_elem_file.files[0];
    var file_reader = new FileReader();

    file_reader.onloadend = function () {
        if (file_reader.error) {
            // layer.alert("文件加载失败")
        } else {
            // layer.alert("文件加载" + str_load_txt.length + "bytes");
            var str_load_txt = file_reader.result;
            var str_file_name = obj_file.name;

            str_file_name = str_file_name.split(".")[0];
            if ("string" !== typeof str_load_txt || 0 === str_load_txt.length) {
                mc_alert_popout("MC_LANG_POPOUT_FILE_COT");
                return;
            }
            var before_load_boxdata_len = ARY_BOX_DATA.length + 1;
            var str_box_name = mc_main_load_msg(str_load_txt, ARY_BOX_DATA, ARY_MOD_DATA);

            if ("string" !== typeof str_box_name) {
                mc_alert_popout("MC_LANG_SAVE_ERROR_" + str_box_name);
                return;
            }
            var ui_box_index = 0;
            var save_box_data = ARY_BOX_DATA;
            var obj_box_json = null;

            // 创建侧边箱体
            if (before_load_boxdata_len < ARY_BOX_DATA.length) {
                // 需要创建多个 暂无多个箱体情况 后续添加需测试
                var ui_create = ARY_BOX_DATA.length - before_load_boxdata_len - 1;

                for (var idx = 0; idx < ui_create; idx++) {
                    ARY_BOX_DATA = save_box_data.slice(0, before_load_boxdata_len + ui_box_index);
                    obj_box_json = mc_layout_get_box_basic(ARY_BOX_DATA[before_load_boxdata_len + ui_box_index].name, ARY_BOX_DATA, ARY_MOD_DATA);

                    get_box_info(true, obj_box_json, false, false, false, str_file_name);
                    ui_box_index++;
                }
            } else {
                var box_name = ARY_BOX_DATA[ARY_BOX_DATA.length - 1].name;
                // 获取当前箱体的全局主控芯片

                // g_str_ctrl_name = ARY_BOX_DATA[ARY_BOX_DATA.length - 1].ctrlchip_name;
                g_str_ctrl_name = ARY_BOX_DATA[ARY_BOX_DATA.length - 1].data.mc_util_get_ui_box_msg().ctrlchip_name;
                obj_box_json = mc_layout_get_box_basic(box_name, ARY_BOX_DATA, ARY_MOD_DATA);

                get_box_info(true, obj_box_json, false, false, false, str_file_name);
            }

            // 创建侧边模组
            get_mod_info(true);
            // mc_alert_popout("MC_LANG_POPOUT_LOAD_SUCCESS", "load_success_callback");
            // 加载成功跳转常规
            STR_PAGE_PATH = "./pages/box_main/box_main.html";
            update_lang_display();
            b_insert_box_file = true;
        }
    };
    file_reader.readAsText(obj_file);
    dom_elem_file.value = "";
}

/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    加载大屏文件
 * 参数:
 *    @param { Promise<Object> } obj 触发对象
 * 返回：
 *    无
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 陈小荟
 *      时间 : 2020.9.30
 *      内容 : 所有代码
 ************************************************************************************************/
function mc_load_screen_file(obj) {
    mc_loading_wait();
    var dom_elem_file = obj;

    if (!dom_elem_file) {
        mc_alert_popout("MC_LANG_POPOUT_FILE_DATA_EXCEPTION");
        return;
    }

    if (!(dom_elem_file.files) || !(dom_elem_file.files[0])) {
        mc_alert_popout("MC_LANG_POPOUT_FILE_DATA_EXCEPTION");
        return;
    }

    //获取文件对象
    var obj_file = dom_elem_file.files[0];
    var file_reader = new FileReader();
    // 固定长度截取 文件内容时注意，在切分点会有乱码出现的可能,如果文件太大，截取内容小会出现假死现象，因为js执行是同步的
    var ui_step = 1024 * 512;
    // 文件大小
    var ui_total = obj_file.size;
    // 当前获取位置下标
    var ui_cuLoaded = 0;
    var o_screen_data = {};
    var str_file_name = "";

    file_reader.onload = function (e) {
        // 完成加载
        ui_cuLoaded += e.loaded;
        if (ui_cuLoaded < ui_total) {
            var str_blob = obj_file.slice(ui_cuLoaded, ui_cuLoaded + ui_step);

            file_reader.readAsText(str_blob, "gbk");
        } else {
            ui_cuLoaded = ui_total;
        }
    };

    file_reader.onloadend = function () {
        if (file_reader.error) {
            mc_alert_popout("MC_LANG_POPOUT_FILE_DATA_EXCEPTION");
        } else {
            try {
                var str_red_val = file_reader.result;
                var before_load_boxdata_len = ARY_BOX_DATA.length + 1;

                o_screen_data = mc_layout_lod_file(str_red_val, ARY_BOX_DATA, ARY_MOD_DATA);
                str_file_name = obj_file.name;

                str_file_name = str_file_name.split(".")[0];
                if (!o_screen_data || !o_screen_data.data) {
                    mc_alert_popout("MC_LANG_POPOUT_RESOLUT_FAIL");
                } else {
                    var ui_box_index = 0;
                    var str_box_json = "";

                    // 创建侧边箱体
                    if (before_load_boxdata_len < ARY_BOX_DATA.length) {
                        // 需要创建多个
                        var ui_create = ARY_BOX_DATA.length - (before_load_boxdata_len - 1);

                        create_size_item(0, ui_create, before_load_boxdata_len, ui_box_index);
                    } else {
                        if (!ARY_BOX_DATA[ARY_BOX_DATA.length - 1]) {
                            // 没有箱体名称 即大屏加载无箱体文件时

                            // 直接创建侧边大屏 不创建箱体模组
                            ui_screen_cur_page = ARY_SCREEN_DATA.length;
                            o_screen_data.name = "mc_screen_name" + ARY_SCREEN_DATA.length;
                            ARY_SCREEN_DATA.push(o_screen_data);
                            get_screen_info(true, false, str_file_name);
                            // 跳转大屏
                            STR_PAGE_PATH = "./pages/box_design/height_lever_layout.html?enter=add_screen&is_save=true";
                            update_lang_display();
                            mc_loading_wait_remove();
                            mc_alert_popout("MC_LANG_POPOUT_LOAD_SUCCESS");
                        } else {
                            var box_name = ARY_BOX_DATA[ARY_BOX_DATA.length - 1].name;

                            str_box_json = mc_layout_get_box_basic(box_name, ARY_BOX_DATA, ARY_MOD_DATA);
                            get_box_info(true, str_box_json);
                            mc_sdk_apply_box(box_name, ARY_BOX_DATA, ARY_MOD_DATA, function () {
                                create_size_mod_update();
                            });
                        }
                    }
                }
            } catch (error) {
                mc_alert_popout("Error:" + error);
            }
            mc_loading_wait_remove();
        }
    };
    file_reader.readAsText(obj_file);
    dom_elem_file.value = "";

    // 创建侧边箱体 应用箱体数据
    function create_size_item(ui_idx, ui_index, before_load_boxdata_len, ui_box_index) {
        if (ui_idx < ui_index) {
            var ui_box_idx = (before_load_boxdata_len - 1) + ui_box_index;
            var box_name = ARY_BOX_DATA[ui_box_idx].name;
            var str_box_json = mc_layout_get_box_basic(box_name, ARY_BOX_DATA, ARY_MOD_DATA);

            get_box_info(true, str_box_json, false, false, (ui_box_idx + 1));
            ui_box_index++;
            // 应用当前箱体数据
            mc_sdk_apply_box(box_name, ARY_BOX_DATA, ARY_MOD_DATA, function () {
                create_size_item(++ui_idx, ui_index, before_load_boxdata_len, ui_box_index);
            });
        } else {
            create_size_mod_update();
        }
    }

    // 创建侧边模组大屏 跳转页面
    function create_size_mod_update() {
        // 创建侧边模组
        get_mod_info(true);
        mc_loading_wait_remove();
        mc_alert_popout("MC_LANG_POPOUT_LOAD_SUCCESS");

        // 创建侧边大屏
        ui_screen_cur_page = ARY_SCREEN_DATA.length;
        o_screen_data.name = "mc_screen_name" + ARY_SCREEN_DATA.length;
        ARY_SCREEN_DATA.push(o_screen_data);
        get_screen_info(true, false, str_file_name);
        // 跳转大屏
        STR_PAGE_PATH = "./pages/box_design/height_lever_layout.html?enter=add_screen&is_save=true";
        update_lang_display();
    }
}


/****************************媒体查询 当屏幕显示小于500时，若侧边栏固定 将其浮起************************/
var mc_mql = window.matchMedia("(max-width: 500px)");

mc_mql.addListener(screenTest);

function screenTest(e) {
    if (e.matches) {
        var obj_side = document.getElementsByClassName("add_side_width")[0];

        if (obj_side) {
            var str_status = obj_side.getAttribute("pushpin");

            if ("true" === str_status) {
                obj_side.classList.remove("set_side_pushpin");
                obj_side.classList.add("mc_wrap_div_side_cont");
                obj_side.classList.add("set_pushpin");
                $(".mc_wrap_div_side_cont").children().eq(1).css("width", "46%");
                obj_side.setAttribute("pushpin", false);
                document.getElementsByClassName("select_side_item")[0].classList.remove("select_side_item");
            }
        }
    }
}


/* *************************************硬件连接状态相关函数*******************************************/
var refresh_timer = null;
// 全局硬件连接状态标识
var B_HARDWARE_STATE = false;

/* 获取硬件连接状态 */
mc_set_hardware_connection_library("0", function () {
    var obj_hw_data = new mc_sdk_hardware_data();

    obj_hw_data.get_hw_state(function (str_hardware, obj_sendcard_name, arr_recvcard_list) {
        if (!str_hardware || "" === str_hardware) {
            str_hardware = "[NA]";
            B_HARDWARE_STATE = false;
        }
        mc_main_set_hardware_to_ui(str_hardware, obj_sendcard_name, arr_recvcard_list);
        if ("" !== str_hardware.replace(/[^0-9]/ig, "")) {
            B_HARDWARE_STATE = true;
            // mc_show_side_btn(B_HARDWARE_STATE);
        } else {
            B_HARDWARE_STATE = false;
            // mc_show_side_btn(B_HARDWARE_STATE);
        }
    });
});

/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    显示侧边栏需要硬件连接的按钮
 * 参数:
 *     @param { Promise<Boolean> } b_show 是否显示 true显示 false隐藏
 * 返回：
 *    @return { Promise<Boolean> }
 *     false 参数有误
 *     true 设置成功
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 陈小荟
 *      时间 : 2020.6.30
 *      内容 : 所有代码
 ************************************************************************************************/
function mc_show_side_btn(b_show) {
    if ("boolean" !== typeof b_show) {
        return false;
    }
    var set_gamma_display = document.getElementById("mc_side_gamma");
    // var set_bright_display = document.getElementById("mc_side_bright");
    var set_hub_display = document.getElementById("mc_side_hub");

    if (set_gamma_display && set_hub_display) {
        if (b_show && "none" === set_gamma_display.style.display) {
            set_gamma_display.style.display = "block";
            // set_bright_display.style.display = "block";
            set_hub_display.style.display = "block";
            return true;
        }
        if (!b_show && "block" === set_gamma_display.style.display) {
            set_gamma_display.style.display = "none";
            // set_bright_display.style.display = "none";
            set_hub_display.style.display = "none";
        }
    }
    return true;
}

/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    将硬件连接信息渲染至页面
 * 参数:
 *     @param { Promise<String> } str_hardware 硬件连接信息字串
 *     @param { Promise<Object> } obj_sendcard_name 发送卡name数据对象
 *     @param { Promise<Array> }  arr_recvcard_list 接收卡数量列表
 * 返回：
 *    @return { Promise<Boolean> }
 *     false 参数有误
 *     true 设置成功
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 陈小荟
 *      时间 : 2020.6.30
 *      内容 : 所有代码
 *   2. 类型 : 添加
 *      作者 : 巫昭雯
 *      时间 : 2021.1.20
 *      内容 : 添加title值;
 *   3. 类型 : 添加
 *      作者 : 陈小荟
 *      时间 : 2021.6.04
 *      内容 : 发送卡标识，存储发送卡数据;
 ************************************************************************************************/
function mc_main_set_hardware_to_ui(str_hardware, obj_sendcard_name, arr_recvcard_list) {
    if ("string" !== typeof str_hardware || 0 >= str_hardware.length) {
        return false;
    }

    var str_title = obj_lang_map.MC_LANG_POPOUT_CHECK_CONNECTION_STATUS;
    var str_card_title = str_title;
    var str_hw_topo = str_title;
    var obj_sendcard_state = $("#sencard_state");
    var str_status = "";

    if ("[NA]" !== str_hardware.trim()) {
        str_card_title = obj_lang_map.MC_LANG_VIEW_SENDCARD_LIST;
        str_hw_topo = obj_lang_map.MC_LANG_VIEW_HW_TOPO;
    }
    g_obj_sendcard_data.set_data(obj_sendcard_name, arr_recvcard_list);
    str_status = g_obj_sendcard_data.get_sendcard_state();

    if (0 !== str_status.length) {
        obj_sendcard_state.text(str_status);
    }
    $("#hardware_state").text(str_hardware).attr("title", str_hw_topo);
    obj_sendcard_state.attr("title", str_card_title);
    return true;
}

/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    是否开启获取硬件连接信息定时器 - 点击事件
 * 参数:
 *     @param { Promise<Object> } obj 点击当前对象
 * 返回：
 *    无
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 陈小荟
 *      时间 : 2020.6.30
 *      内容 : 所有代码
 ************************************************************************************************/
function mc_refresh(obj) {
    var str_b = obj.getAttribute("is_refresh");

    if ("false" === str_b) {
        // 控制计时器获取硬件连接信息
        $(".mc_refresh_circle").addClass("mc_refresh_true");
        obj.setAttribute("is_refresh", true);
        B_UPDATE_REGRESH = true;
        localStorage.setItem("B_UPDATE_REGRESH", true);
        refresh_connection();
    } else {
        clearInterval(refresh_timer);
        $(".mc_refresh_circle").removeClass("mc_refresh_true");
        obj.setAttribute("is_refresh", false);
        B_UPDATE_REGRESH = false;
        localStorage.setItem("B_UPDATE_REGRESH", false);
        refresh_connection();
    }
}

// 定时更新硬件连接信息
refresh_connection();

function refresh_connection() {
    if (B_UPDATE_REGRESH) {
        clearInterval(refresh_timer);
        refresh_timer = setInterval(function () {
            if ("false" === localStorage.getItem("B_UPDATE_REGRESH")) {
                clearInterval(refresh_timer);
            }
            var obj_hw_data = new mc_sdk_hardware_data();

            obj_hw_data.get_hw_state(function (str_hardware, obj_sendcard_name, arr_recvcard_list) {
                if (!str_hardware || "" === str_hardware) {
                    str_hardware = "[NA]";
                    B_HARDWARE_STATE = false;
                }

                mc_main_set_hardware_to_ui(str_hardware, obj_sendcard_name, arr_recvcard_list);
                if ("" !== str_hardware.replace(/[^0-9]/ig, "")) {
                    B_HARDWARE_STATE = true;
                    // mc_show_side_btn(B_HARDWARE_STATE);
                } else {
                    // mc_show_side_btn(B_HARDWARE_STATE);
                    B_HARDWARE_STATE = false;
                }
            });
        }, 5000);
    } else {
        clearInterval(refresh_timer);
        B_UPDATE_REGRESH = false;
    }
}


/* *************************************弹框相关函数**********************************************/
/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    layer.confirm 询问框/提示框封装
 * 参数:
 *    @param {Promise<Object>} params 询问框参数字串
 *    @param {Promise<Boolean>} b_main_popout true 为main页面弹框 可为空
 * 参数备注:
 *    params = {
 *      msg: 提示信息: string,
 *      title: 标题文本: string, 此项可为空 默认:"信息"
 *      btn: 按钮文本: array, 此项可为空 默认:[确定,取消] 数组项个数为按钮个数
 *      confirm_callback: 确定回调函数名 :string, 此项可为空
 *      confirm_close: 确定弹框关闭后回调函数名 :string, 此项可为空 （先关闭当前iframe页面后调用，可调用下个页面函数）
 *      cancel_callback: 取消回调函数名 :string, 此项可为空
 *      close_iframe: 确定关闭是否关闭iframe弹层页 :boolean true不关闭, 此项可为空 默认关闭
 *      manual_close_prev: 是否需要手动关闭上一层iframe页 :boolean true关闭，此项可为空 默认不操作此步骤
 *      close_prev_iframe: 当存在数个iframe层,关闭最后一个,保留前面的iframe层,不一次性全关掉; (:boolean true 执行) 此项可为空 默认不执行照旧(处理应用后关闭提示框是否再关闭一层frame,此时至少存在三层frame层及以上)
 *    }
 *    所有文本传入语言ID
 * 返回：
 *    @returns {Promise<Boolean>}
 *     true 设置成功
 *     false 参数有误
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 陈小荟
 *      时间 : 2020.6.17
 *      内容 : 所有代码
 ************************************************************************************************/
function mc_confirm_popout(params, b_main_popout) {
    if ("object" !== typeof params) {
        return false;
    }
    var arr_btn_cont = [];
    var b_iframe_popout = false;
    // 是否关闭当前iframe
    var b_close = true;
    // 是否手动关闭第一个iframe
    var b_close_prev_frame = false;
    // 是否只关最后一个iframe
    var b_close_last_frame = true;

    if (params.close_prev_iframe && "" !== params.close_prev_iframe) {
        b_close_last_frame = false;
    }

    if (params.close_iframe && "" !== params.close_iframe) {
        b_close = !params.close_iframe;
    }

    if (params.manual_close_prev && "" !== params.manual_close_prev) {
        b_close_prev_frame = params.manual_close_prev;
    }

    // title
    if (!params.title || "" === params.title) {
        params.title = "MC_LANG_POPOUT_MESSAGE";
    }

    // btn
    if (!params.btn || "" === params.btn) {
        params.btn = ["MC_LANG_BTN_SCREEN_OK", "MC_LANG_BTN_SCREEN_CANCEL"];
    }
    for (var idx = 0; idx < params.btn.length; idx++) {
        var str_btn = params.btn[idx];

        arr_btn_cont.push(g_obj_lang.get_item_val(str_btn));
    }

    layer.confirm(
        g_obj_lang.get_item_val(params.msg), {
            title: g_obj_lang.get_item_val(params.title),
            btn: arr_btn_cont
        },
        function (index) {
            // 确定回调
            if (params.confirm_callback && "" !== params.confirm_callback) {
                b_iframe_popout = mc_whether_in_iframe_popout();
                mc_popout_callback(b_main_popout, params.confirm_callback, b_iframe_popout, function (b_iframe_close) {
                    // 无传递确定关闭回调函数时
                    if (b_iframe_close && b_close) {
                        layer.close(ui_layer_index);
                    }
                });

                if (b_close_prev_frame) {
                    mc_close_prev_iframe_popout();
                }
            }

            // 询问框关闭
            layer.close(index);
            // 确定关闭 iframe页面关闭 可调用下个页面函数
            if (params.confirm_close && "" !== params.confirm_close) {
                // 当前正在iframe弹层页面
                if (mc_whether_in_iframe_popout()) {
                    b_iframe_popout = true;
                    if (b_close && b_close_last_frame) {
                        layer.close(ui_layer_index);
                    }
                }

                b_iframe_popout = mc_whether_in_iframe_popout();
                mc_popout_callback(b_main_popout, params.confirm_close, b_iframe_popout);
            }
        },
        function () {
            b_iframe_popout = mc_whether_in_iframe_popout();
            // 取消关闭
            if (params.cancel_callback && "" !== params.cancel_callback) {
                mc_popout_callback(b_main_popout, params.cancel_callback, b_iframe_popout);
            }
        }
    );

    return true;
}


/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    调用提示框
 * 参数:
 *    @param {Promise<String>} str_msg 提示信息字串 语言ID
 *    @param {Promise<String>} str_alert_close_callback 弹框关闭回调 可为空
 *    @param {Promise<Boolean>} b_iframe_close 不允许关闭iframe弹层页面 ture不关闭 可为空
 * 返回：
 *    @returns {Promise<Boolean>}
 *     true 调用成功
 *     false 参数有误
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 陈小荟
 *      时间 : 2020.6.18
 *      内容 : 所有代码
 ************************************************************************************************/
function mc_alert_popout(str_msg, str_alert_close_callback, b_iframe_close) {
    if ("string" !== typeof str_msg || 0 === str_msg.length) {
        return false;
    }
    var obj_popuot = {
        msg: str_msg,
        title: "MC_LANG_POPOUT_PROMPT",
        // btn: ["MC_LANG_TRANCE_POINT_OK"],
        btn: ["MC_LANG_TRANCE_POINT_SURE"],
        confirm_close: "",
        close_iframe: ""
    };

    if (str_alert_close_callback) {
        obj_popuot.confirm_close = str_alert_close_callback;
    }
    if (b_iframe_close) {
        obj_popuot.close_iframe = b_iframe_close;
    }
    mc_confirm_popout(obj_popuot);
    return true;
}

/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    判定当前弹框调用的函数为本页面还是二级页面并执行
 * 参数:
 *    @param {Promise<Boolean>} b_main_popout 正在main页面 为true
 *    @param {Promise<String>} str_callback 调用的函数名
 *    @param {Promise<Boolean>} b_iframe_popout 正在iframe弹层页面
 *    @param {Promise<Function>} fn_callback 标识是否正在关闭iframe弹层页询问框 参数为true回调关闭iframe弹层页
 * 返回：
 *    @returns {Promise<Function>}
 *     fn_callback(true) 正在关闭iframe弹层页的询问按钮
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 陈小荟
 *      时间 : 2020.6.17
 *      内容 : 所有代码
 ************************************************************************************************/
function mc_popout_callback(b_main_popout, str_callback, b_iframe_popout, fn_callback) {
    var mc_page_method = null;

    // main
    if (b_main_popout) {
        mc_page_method = window[str_callback];
    }
    // iframe
    if (b_iframe_popout) {
        if (mc_whether_in_iframe_popout()) {
            mc_page_method = $("#layui-layer-iframe" + ui_layer_index)[0].contentWindow[str_callback];
        }
    }
    // page
    if (!b_main_popout && !b_iframe_popout) {
        // mc_page_method = document.getElementById("iframe_content_subpage").contentWindow[str_callback];
        mc_page_method = mc_get_bto_fun(str_callback);
    }
    if (mc_page_method) {
        mc_page_method();
        if (fn_callback) {
            return fn_callback(b_iframe_popout);
        }
    }
    return true;
}

/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    返回底层iframe函数
 * 参数:
 *    @param {Promise<String>} str_fun_name 函数名
 * 返回：
 *    @returns {Promise<Function>}
 *     匹配函数
 *     false 无此函数
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 陈小荟
 *      时间 : 2020.8.20
 *      内容 : 所有代码
 ************************************************************************************************/
function mc_get_bto_fun(str_fun_name) {
    if ("string" !== typeof str_fun_name || 0 === str_fun_name.length) {
        return false;
    }
    var elem_iframe = document.getElementsByTagName("iframe")[0].contentWindow;

    while (elem_iframe) {
        if ("undefined" !== typeof (elem_iframe[str_fun_name])) {
            return elem_iframe[str_fun_name];
        } else if (elem_iframe.document.getElementsByTagName("iframe")[0] && elem_iframe !== elem_iframe.document.getElementsByTagName("iframe")[0].contentWindow) {
            elem_iframe = elem_iframe.document.getElementsByTagName("iframe")[0].contentWindow;
        } else {
            return false;
        }
    }
    return false;
}

/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    判定当前是否在iframs弹层页 更新弹层页下标 （界面最上层）
 * 参数:
 *    无
 * 返回：
 *    @returns {Promise<Boolean>}
 *     true 在iframe弹层页
 *     false 不在iframe弹层页
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 陈小荟
 *      时间 : 2020.6.30
 *      内容 : 所有代码
 ************************************************************************************************/
function mc_whether_in_iframe_popout() {
    var obj_iframe = document.getElementsByClassName("layui-layer-iframe");
    var ui_max_index = -1;

    if (0 !== obj_iframe.length) {
        if (1 === obj_iframe.length) {
            ui_layer_index = parseInt(obj_iframe[0].getAttribute("times"), 10);
            return true;
        }
        for (var idx = 0; idx < obj_iframe.length; idx++) {
            var ui_index = parseInt(obj_iframe[idx].getAttribute("times"), 10);

            // if (0 === idx) {
            //     ui_max_index = ui_index;
            // }
            if (ui_max_index < ui_index) {
                ui_max_index = ui_index;
            }
        }
        if (-1 !== ui_max_index) {
            ui_layer_index = ui_max_index;
            return true;
        }
    }
    return false;
}

/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    关闭第一个iframe弹层页 适用弹层页面询问打开多级弹层页
 * 参数:
 *    无
 * 返回：
 *     @returns {Promise<Boolean>}
 *     true 关闭成功
 *     false 只有一个iframe层
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 陈小荟
 *      时间 : 2020.7.1
 *      内容 : 所有代码
 ************************************************************************************************/
function mc_close_prev_iframe_popout() {
    var obj_iframe = document.getElementsByClassName("layui-layer-iframe");
    var ui_min_index = Math.pow(2, 32) - 1;

    if (obj_iframe) {
        if (1 === obj_iframe.length) {
            return false;
        }
        for (var idx = 0; idx < obj_iframe.length; idx++) {
            var ui_index = parseInt(obj_iframe[idx].getAttribute("times"), 10);

            if (ui_min_index > ui_index) {
                ui_min_index = ui_index;
            }
        }
    }
    layer.close(ui_min_index);
    return true;
}

/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    关闭第一个iframe弹层页
 * 参数:
 *    无
 * 返回：
 *     @returns {Promise<Boolean>}
 *     true 关闭成功
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 陈小荟
 *      时间 : 2020.7.1
 *      内容 : 所有代码
 ************************************************************************************************/
function mc_close_iframe_popout() {
    var obj_iframe = document.getElementsByClassName("layui-layer-iframe");

    if (obj_iframe) {
        if (1 === obj_iframe.length) {
            layer.close(parseInt(obj_iframe[0].getAttribute("times"), 10));
        }
    }
    return true;
}

/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    加载添加loading
 * 参数:
 *     @param {Promise<String>} str_text 提示信息 可为空
 *     @param {Promise<String>} str_add_class text标签添加class
 * 返回：
 *    无
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 陈小荟
 *      时间 : 2020.6.29
 *      内容 : 所有代码
 ************************************************************************************************/
function mc_loading_wait(str_text, str_add_class) {
    if (!str_text) {
        str_text = "";
    }
    // 弹层存在并且无更新
    if (document.getElementById("mc_loading_box") && 0 === str_text.length) {
        return;
    }
    var str_text_class = str_add_class ? "mc_loading_text " + str_add_class : "mc_loading_text";
    var loading_html =
        "<div id='mc_loading_box' style='z-index:2147483647;'><div class='mc_loading_box'><div class='mc_loading'><div class='bounce1'></div><div class='bounce2'></div><div class='bounce3'></div></div><div class='" + str_text_class + "'>" + str_text + "</div></div><div class='mc_loading_cover'></div></div>";

    mc_loading_wait_remove();
    $("#main_page_cont").append(loading_html);
    return;
}

// 加载完成去除loading
function mc_loading_wait_remove() {
    var obj_loading = $("#mc_loading_box");

    if (0 < obj_loading.length) {
        $("#mc_loading_box").remove();
    }
}

/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    更新loading提示信息
 * 备注：
 *    不存在loading创建
 *    存在loading 更新提示信息
 * 参数:
 *     @param {Promise<String>} str_text 提示信息 可为空
 *     @param {Promise<String>} str_add_class text标签添加class
 * 返回：
 *    @return { Promise<Boolean> }
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 陈小荟
 *      时间 : 2021.9.29
 *      内容 : 所有代码
 ************************************************************************************************/
function mc_update_load_txt(str_text, str_add_class) {
    if ("[OBJECT STRING]" !== Object.prototype.toString.call(str_text).toUpperCase() || 0 === str_text.length) {
        return false;
    }
    var obj_txt_dom = document.getElementsByClassName("mc_loading_text")[0];

    if ("[OBJECT HTMLDIVELEMENT]" !== Object.prototype.toString.call(obj_txt_dom).toUpperCase()) {
        mc_loading_wait(str_text, str_add_class);
        return true;
    }
    var reg = /]+>/g;

    if (reg.test(str_text)) {
        obj_txt_dom.innerHTML = str_text;
    } else {
        obj_txt_dom.innerText = str_text;
    }
    return true;
}

/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    语言切换侧栏更新
 * 参数:
 *    无
 * 返回：
 *    @return { Promise<Boolean> }
 *     true 切换成功
 *     false 无需切换
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 陈小荟
 *      时间 : 2020.6.20
 *      内容 : 所有代码
 ************************************************************************************************/
function switch_language() {
    ui_mod_cur_page = 0;
    ui_mod_load_cur_page = 0;

    if (0 !== ARY_MOD_DATA.length) {
        get_mod_info(true, 1);
    }

    for (var idx_box_data = 0; idx_box_data < ary_side_box_data.length; idx_box_data++) {
        var obj_data = ary_side_box_data[idx_box_data];

        get_box_info(true, obj_data, 1, idx_box_data + 1);
    }
    if (0 !== ARY_SCREEN_DATA.length) {
        get_screen_info(true, 1);
    }

    // 记录当前选中项
    var arr_cur_page = document.getElementsByClassName("select_side_item");

    for (var idx = 0; idx < arr_cur_page.length; idx++) {
        var obj_item = arr_cur_page[idx].children[1];

        if (!obj_item) {
            continue;
        }
        var str_id_tip = obj_item.getAttribute("id").slice(3, 4);
        var str_cur_page = obj_item.getAttribute("side_btn");

        if ("m" === str_id_tip) {
            ui_mod_cur_page = parseInt(str_cur_page, 10) - 1;
        }
        if ("b" === str_id_tip) {
            ui_box_cur_page = parseInt(str_cur_page, 10) - 1;
        }
        if ("s" === str_id_tip) {
            ui_screen_cur_page = parseInt(str_cur_page, 10) - 1;
        }
    }
    box_page_get_focus();
    return true;
}

/* ******************************************数据处理**********************************************/
/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    存入侧边箱体链接信息 宽高主控芯片及HUB
 * 参数:
 *    @param {Promise<Object>} obj_box_data 箱体链接数据{COMMAND:"",FUNCTION:"",PARAMS:[]};
 *    @param {Promise<Array>} ary_box_data 储存箱体的数组
 *    @param {Promise<String>} str_box_name 当前存储箱体数据的箱体名称
 *    @param {Promise<Number>} ui_idx_data 当前存储数据下标
 * 返回：
 *    @returns {Promise<Boolean>}
 *     true 存储成功
 *     false 参数有误
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 陈小荟
 *      时间 : 2020.04.30
 *      内容 : 所有代码
 ************************************************************************************************/
function mc_save_side_box_data(obj_box_data, ary_box_data, str_box_name, ui_idx_data) {
    if (Array.isArray(obj_box_data) || "object" !== typeof obj_box_data) {
        return false;
    }
    if (!Array.isArray(ary_box_data)) {
        return false;
    }
    if ("string" !== typeof str_box_name || "number" !== typeof ui_idx_data) {
        return false;
    }
    var obj_sdk_param = new mc_sdk_param();

    obj_sdk_param.set_param_clear();
    obj_sdk_param.set_json(JSON.stringify(obj_box_data));
    var obj_data = {
        name: str_box_name,
        ctrlchip_name: obj_sdk_param.get_param_value("MC_LANG_CTRLCHIP_LIST"),
        hub_name: obj_sdk_param.get_param_value("MC_LANG_LABLE_HUB"),
        width: obj_sdk_param.get_param_value("MC_LANG_LABLE_WEITH"),
        height: obj_sdk_param.get_param_value("MC_LANG_LABLE_HEIGHT")
    };

    // 若存在 更新
    if (ary_box_data[ui_idx_data]) {
        ary_box_data[ui_idx_data] = obj_data;
    } else {
        ary_box_data.push(obj_data);
    }
    return true;
}

/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    删除数组数据
 * 参数:
 *    @param {Promise<Uint>} ui_idx
 *    @param {Promise<Array>} ary_data
 * 返回:
 *    @returns {Promise<boolean>} 函数执行结果
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 徐烁超
 *      时间 : 2020.4.16
 *      内容 : 所有代码
 ************************************************************************************************/
function mc_data_dispose_remove_data(ui_idx, ary_data) {
    if ("number" !== typeof ui_idx) {
        return false;
    }
    if (!Array.isArray(ary_data) || 0 >= ary_data.length) {
        return false;
    }
    if (0 > ui_idx || ui_idx > ary_data.length) {
        return false;
    }
    ary_data.splice(ui_idx, 1);
    return true;
}

/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    删除侧边模组-判断是否可删除 / 删除侧边箱体-修改使用模组名数据
 * 参数:
 *    @param {Promise<String>} str_remove_data 准备删除的数据
 *    @param {Promise<Array>} ary_data 删除数据所在数组
 *    @param {Promise<Boolean>} b_remove 匹配项是否删除 true删除
 * 返回：
 *    @returns {Promise<Boolean>}
 *    false 参数有误/不可删除侧栏项
 *    true 删除成功/可删除侧栏项
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 陈小荟
 *      时间 : 2020.6.22
 *      内容 : 所有代码
 ************************************************************************************************/
function mc_remove_arr_data(str_remove_data, ary_data, b_remove) {
    if ("string" !== typeof str_remove_data || 0 === str_remove_data.length) {
        return false;
    }
    if (!Array.isArray(ary_data)) {
        return false;
    }
    // 是否删除侧栏项标识
    var b_remove_side = true;

    for (var idx = 0; idx < ary_data.length; idx++) {
        // 正在删除箱体
        if (b_remove) {
            var str_item = ary_data[idx].name;

            if (str_remove_data === str_item) {
                ary_data.splice(idx, 1);
                return b_remove_side;
            }
        } else {
            var ary_item = ary_data[idx].use_mod_name;
            // 正在删除模组

            for (var idx_name = 0; idx_name < ary_item.length; idx_name++) {
                var str_name = ary_item[idx_name];

                if (str_remove_data === str_name) {
                    // 匹配项不允许删除 显示提示信息
                    b_remove_side = false;
                    mc_alert_popout("MC_LANG_POPOUT_MOD_DELECT");
                    return b_remove_side;
                }
            }
        }
    }
    return b_remove_side;
}


/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    读取箱体GAMMA表(回读)
 * 参数:
 *    @param {Promise<StringConstructor>} str_order    命令指令
 *    @param {Promise<function>} fun_callback     回调函数

 * 返回：
 *   null
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 李智明
 *      时间 : 2020.6.28
 *      内容 : 所有代码
 ************************************************************************************************/
function mc_read_box_gamma(str_order, fun_callback) {
    if ("function" !== typeof fun_callback) {
        fun_callback("");
        return;
    }
    var str_box_gamma_json_req = new mc_sdk_param();

    str_box_gamma_json_req.set_param_clear();
    str_box_gamma_json_req.set_cmd("GET_PARAM");
    str_box_gamma_json_req.set_func("HW_BOX_GAMA");
    str_box_gamma_json_req.set_param_value("RECVCARD", str_order);

    $.post("/access_shell", str_box_gamma_json_req.get_json(), function (result, status) {
        if ("success" !== status) {
            fun_callback("");
            return;
        }
        var obj_param_box_gamma = new mc_sdk_param();

        obj_param_box_gamma.set_json(result);
        var str_gamma_r = obj_param_box_gamma.get_param_value("GAMA_R");
        var str_gamma_g = obj_param_box_gamma.get_param_value("GAMA_G");
        var str_gamma_b = obj_param_box_gamma.get_param_value("GAMA_B");
        var str_gamma_id = obj_param_box_gamma.get_param_value("GAMA_ID");
        var str_error = obj_param_box_gamma.get_param_value("ERROR_CODE");

        var obj_box_gamma = {
            "str_gamma_r": str_gamma_r,
            "str_gamma_g": str_gamma_g,
            "str_gamma_b": str_gamma_b,
            "str_gamma_id": str_gamma_id
        };


        fun_callback(obj_box_gamma, str_error);
        return;
    });
}


/* ***************************************other**********************************************/
/*************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    获取当前鼠标位置
 * 参数:
 *    @param { Promise<Object> } eve 事件对象
 * 返回：
 *     @return { Promise<Object> }
 *      null 参数有误
 *      obj_new_pny = {X:,Y}
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 陈小荟
 *      时间 : 2021.5.24
 *      内容 : 所有代码
 ************************************************************************************************/
function mc_get_pnt(eve) {
    var obj_new_pnt = null;

    if (B_ISTOUCH) {
        obj_new_pnt = get_cur_pos(false, eve);
    } else {
        if ("[object TouchEvent]" !== Object.prototype.toString.call(eve)) {
            return null;
        }
        obj_new_pnt = {
            X: eve.changedTouches[0].pageX,
            Y: eve.changedTouches[0].pageY
        };
    }
    return obj_new_pnt;
}

/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    获取当前版本号
 * 参数:
 *    NA
 * 返回：
 *    NA
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 徐烁超
 *      时间 : 2020.8.24
 *      内容 : 所有代码
 ************************************************************************************************/
function mc_get_vers_number() {
    mc_sdk_get_vers_number(function (str_vers_num_json) {
        var obj_sdk_param = new mc_sdk_param();

        obj_sdk_param.set_json(str_vers_num_json);
        var str_vers_number = obj_sdk_param.get_param_value("EDITION");

        if ("string" !== typeof str_vers_number || 0 >= str_vers_number.length || "\\" === str_vers_number) {
            return;
        }
        $("#vers_msg_page").text(str_vers_number).attr("title", str_vers_number);
    });
}

/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    箱体连接/大屏连接 选择添加模组/箱体/变换设置 ---弹层
 * 备注:
 *    添加模块为页面对话框
 *    变换设置、快速布局为首页iframe层
 * 参数:
 *    @param { Promise<Object> } obj_param {b_screen:boolean是否在大屏页,open_pot:object打开子对话框对象}
 *     @param { Promise<String> } str_other 添加其余标识
 * 返回：
 *    @return { Promise<Boolean> }
 *     true 设置成功
 *     false 参数类型错误
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 陈小荟
 *      时间 : 2020.9.3
 *      内容 : 所有代码
 ************************************************************************************************/
function mc_add_list_choose(obj_param, str_other) {
    if ("[object Object]" !== Object.prototype.toString.call(obj_param)) {
        return false;
    }
    var obj_popout = {
        icon: "",
        title: "",
        url: "",
        area: ["300px", "100%"],
        skin: "layui-anim layui-anim-rl layui-layer-adminRight level_nd",
        set_min_width: "320px"
    };


    if ("quick_layout" !== str_other) {
        // 添加模块 对话框参数设置
        obj_popout.set_shade = 0;
    }
    if ("transform" === str_other) {
        // 变换设置
        obj_popout.icon = "icon-transfer";
        obj_popout.title = "MC_LANG_TRANSFORMATION";
        obj_popout.url = "./pages/check_mod/check_mod.html?add_choose=transform&other_movement=" + str_other;
        obj_popout.area = ["300px", "100%"];
        G_OBJ_ROUTER_PAGE.set_popup_layer_msg(obj_popout);
        // G_OBJ_ROUTER_PAGE.open_popup_layer();
        return true;
    }

    if (obj_param.b_screen) {
        if ("add_screen" === str_other) {
            // 选择大屏
            obj_popout.icon = "icon-screen-connect";
            obj_popout.title = "MC_LANG_SELECT_ADD_SCREEN";
            obj_popout.url = "./pages/check_mod/check_mod.html?add_choose=screen&other_movement=" + str_other;
        } else {
            // 选择箱体
            obj_popout.icon = "icon-box-connect";
            obj_popout.title = "MC_LANG_SELECT_ADD_BOX";
            // if (b_quick) {
            //     obj_popout.url = "../check_mod/check_mod.html?add_choose=box&other_movement=" + str_other;
            // } else {
            obj_popout.url = "./pages/check_mod/check_mod.html?add_choose=box&other_movement=" + str_other;
            // }
        }
        G_OBJ_ROUTER_PAGE.set_popup_layer_msg(obj_popout);
        // G_OBJ_ROUTER_PAGE.open_popup_layer();
    } else {
        // 添加模组
        if (0 !== ARY_MOD_DATA.length) {
            // 选择模组
            obj_popout.icon = "icon-mod-wizard";
            obj_popout.title = "MC_LANG_SELECT_ADD_MOD";
            // if (b_quick) {
            //     obj_popout.url = "../check_mod/check_mod.html?add_choose=mod&other_movement=" + str_other;
            // } else {
            obj_popout.url = "./pages/check_mod/check_mod.html?add_choose=mod&other_movement=" + str_other;
            // }
            G_OBJ_ROUTER_PAGE.set_popup_layer_msg(obj_popout);
            // G_OBJ_ROUTER_PAGE.open_popup_layer();
        }
    }
    return true;
}

// 箱体页面获得焦点，避免document键盘事件不生效
function box_page_get_focus() {
    if (B_BOX_PAGE) {
        var o_box_get_focus = document.getElementById("iframe_content_subpage").contentWindow.document.getElementById("mc_box_hl_focus");

        $(o_box_get_focus).css("display", "block").focus().css("display", "none");
    }
}

/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    创建箱体链接对象
 * 参数:
 *    NA
 * 返回：
 *    @return {Promise<Object>} 箱体链接对象
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 徐烁超
 *      时间 : 2020.10.12
 *      内容 : 所有代码
 ************************************************************************************************/
function mc_data_recvcard() {
    return new mc_sdk_recvcard();
}

/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    创建模组对象
 * 参数:
 *    NA
 * 返回：
 *    @return {Promise<Object>} 模组对象
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 徐烁超
 *      时间 : 2020.10.12
 *      内容 : 所有代码
 ************************************************************************************************/
function mc_data_module() {
    return new mc_sdk_module();
}

/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    创建箱体数据对象
 * 参数:
 *    NA
 * 返回：
 *    @return {Promise<Object>} 箱体数据对象
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 徐烁超
 *      时间 : 2020.10.12
 *      内容 : 所有代码
 ************************************************************************************************/
function mc_data_box() {
    return new mc_ui_box();
}

/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    存入箱体链接中引脚字段,并检测箱体数据是否正常
 * 参数:
 *    @param {Promise<Object>} obj_box_msg 箱体页面生成数据
 *    @param {Promise<String>} str_box_first_mod_name 箱体下最小jx下第一个模组名称
 *    @param {Promise<Array>} ary_mod_data 模组数据
 * 返回：
 *    @return {Promise<Number>} 存入结果
 * 备注:
 *    0:完成
 *    1:芯片错误
 *    2:分组模式错误
 *    3:引脚错误
 *    4:三线并行,颜色不同
 *    5:其他错误
 *    6:行扫数错误
 * 注意:
 *      1.一个箱内的所有芯片，行扫数，数据串类型必需一致（串行不管几灯串还是乱串，都认为是串行）
 *      2.至于第一个口是一组数据，第二个口是两组数据，这个不强制，但是你那边可以简单点处理，要求必需一样
 *      3.三线并行的，三个线颜色顺序可以不一样，但是一个组串的所有模组，必需一样，这个也一样，你那边可以简单一点处理，要求必需一样
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 徐烁超
 *      时间 : 2020.10.12
 *      内容 : 所有代码
 ************************************************************************************************/
function mc_main_get_box_xml(obj_box_msg, str_box_first_mod_name, ary_mod_data) {
    // 控制芯片名称
    var str_ctrlchip_name = obj_box_msg.ctrlchip_name;
    // hub芯片名称
    var str_hub_name = obj_box_msg.hub_name;
    // 所有模组列表数据
    var ary_module_list = obj_box_msg.data;
    // dsp描述信息
    var obj_hub_msg = obj_box_msg.edit_val;

    var obj_sdk_recvcard = new mc_sdk_recvcard();

    // 存入主控芯片名称
    obj_sdk_recvcard.mc_util_recvcard_set_ctrlchip_name(str_ctrlchip_name);
    // 存入hub名称
    obj_sdk_recvcard.mc_util_recvcard_set_hub_name(str_hub_name);
    obj_sdk_recvcard.mc_util_recvcard_set_hub_msg(obj_hub_msg);


    var ui_first_mod_idx = mc_main_get_data_idx_in_name(ary_mod_data, str_box_first_mod_name);

    if (-1 === ui_first_mod_idx) {
        return 5;
    }
    var obj_first_mod_data = ary_mod_data[ui_first_mod_idx].data;
    var str_dispchip_name = obj_first_mod_data.mc_util_mod_get_disp_chip();
    var str_scanchip_name = obj_first_mod_data.mc_util_mod_get_scan_chip();
    var ui_grp_mod = Number(obj_first_mod_data.mc_util_mod_get_str_grp_mode());
    var ary_color = obj_first_mod_data.mc_util_mod_get_clr_msg();
    var ui_str_cnt = Number(obj_first_mod_data.mc_util_mod_get_str_cnt());
    var ui_scan_cnt = Number(obj_first_mod_data.mc_util_mod_get_max_scan_cnt());


    for (var idx_jx = 0; idx_jx < ary_module_list.length; idx_jx++) {
        var jx_num = ary_module_list[idx_jx].jx_num;
        var ary_jx_modlist = ary_module_list[idx_jx].children;

        for (var idx_mod = 0; idx_mod < ary_jx_modlist.length; idx_mod++) {
            var str_module_name = ary_jx_modlist[idx_mod].module_name;
            var str_offset_x = ary_jx_modlist[idx_mod].offset_x;
            var str_offset_y = ary_jx_modlist[idx_mod].offset_y;
            var str_mirror = ary_jx_modlist[idx_mod].mirror;
            var str_rotation = ary_jx_modlist[idx_mod].rotation;
            var str_scale = ary_jx_modlist[idx_mod].scale;
            var str_cut = ary_jx_modlist[idx_mod].cut || "0,0,0,0";

            var ui_mod_idx = mc_main_get_data_idx_in_name(ary_mod_data, str_module_name);

            if (-1 === ui_mod_idx) {
                return 5;
            }

            var obj_sdk_module = ary_mod_data[ui_mod_idx].data;
            var str_dispchip_name_use = obj_sdk_module.mc_util_mod_get_disp_chip();
            var str_scanchip_name_use = obj_sdk_module.mc_util_mod_get_scan_chip();
            var ui_grp_mod_use = Number(obj_sdk_module.mc_util_mod_get_str_grp_mode());
            var ary_color_use = obj_sdk_module.mc_util_mod_get_clr_msg();
            var ui_str_cnt_use = Number(obj_sdk_module.mc_util_mod_get_str_cnt());
            var ui_scan_cnt_use = Number(obj_sdk_module.mc_util_mod_get_max_scan_cnt());

            if (
                str_dispchip_name_use !== str_dispchip_name ||
                str_scanchip_name_use !== str_scanchip_name
            ) {
                return 1;
            }
            if (ui_grp_mod !== ui_grp_mod_use) {
                return 2;
            }
            if (ui_str_cnt_use !== ui_str_cnt) {
                return 3;
            }
            if (
                3 === ui_grp_mod &&
                mc_main_color_constar(ary_color, ary_color_use)
            ) {
                return 4;
            }
            if (ui_scan_cnt_use !== ui_scan_cnt) {
                return 6;
            }
            obj_sdk_recvcard.mc_util_recvcard_set_modlist_mod_info(idx_jx, idx_mod, str_module_name, str_offset_x, str_offset_y, str_mirror, str_rotation, str_scale,str_cut);
        }


        if ("?" !== jx_num) {
            jx_num = Number(jx_num) - 1;
            var str_dsp_val = "";
            var ui_dsp_val = Number(jx_num) * ui_str_cnt;
            var ui_fist_mod_idx = mc_main_get_data_idx_in_name(ary_mod_data, ary_jx_modlist[0].module_name);

            for (var idx_dsp = 0; idx_dsp < ui_str_cnt; idx_dsp++) {
                var str_idx_dsp = ary_mod_data[ui_fist_mod_idx].data.mc_util_mod_get_str_pin(idx_dsp);

                str_dsp_val += "(DSP" + ui_dsp_val + ":" + str_idx_dsp + "),";
                ui_dsp_val++;
            }
            obj_sdk_recvcard.mc_util_recvcard_set_modlist_pin_pair_exp(idx_jx, str_dsp_val);
        }
    }
    g_obj_pin_data_test = obj_sdk_recvcard;
    return obj_sdk_recvcard;
}

/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    查询数组中对象name属性为指定名称的下标
 * 参数:
 *    @param {Promise<Array>} ary_data 查询数组
 *    @param {Promise<Array>} str_name_value 查询名称
 * 返回：
 *    @returns {Promise<Boolean>} 是否不同
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 徐烁超
 *      时间 : 2020.10.26
 *      内容 : 所有代码
 ************************************************************************************************/
function mc_main_get_data_idx_in_name(ary_data, str_name_value) {
    if (
        !Array.isArray(ary_data) ||
        !str_name_value
    ) {
        return -1;
    }
    var ui_return = -1;

    for (var idx = 0; idx < ary_data.length; idx++) {
        var obj_data = ary_data[idx];

        if (obj_data.name === str_name_value) {
            ui_return = idx;
            break;
        }
    }
    return ui_return;
}

/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    检测颜色是否不同
 * 参数:
 *    @param {Promise<Array>} ary_color 使用颜色
 *    @param {Promise<Array>} ary_color_contrast 对比颜色
 * 返回：
 *    @returns {Promise<Boolean>} 是否不同
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 徐烁超
 *      时间 : 2020.10.26
 *      内容 : 所有代码
 ************************************************************************************************/
function mc_main_color_constar(ary_color, ary_color_contrast) {
    if (ary_color.length !== ary_color_contrast.length) {
        return true;
    }
    for (var idx_contrast = 0; idx_contrast < ary_color.length; idx_contrast++) {
        if (ary_color[idx_contrast] !== ary_color_contrast[idx_contrast]) {
            return true;
        }
    }
    return false;
}

/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    构造控件设置
 * 参数:
 *    @param {Promise<Object>} obj_item_grp 控件对象
 *    @param {Promise<Object>} obj_lang_map 语言列表
 *    @param {Promise<String>} str_json 数据json字串
 * 返回：
 *    NA
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 陈小荟
 *      时间 : 2020.10.22
 *      内容 : 所有代码
 ************************************************************************************************/
function mc_construct_set_popout(obj_item_grp, obj_lang_map, str_json) {
    var obj_combo_mode = set_combo_val(str_json, true);

    obj_item_grp.set_lang_map(obj_lang_map);
    obj_item_grp.set_rgb_combo_mode(obj_combo_mode);
    obj_item_grp.set_max_col_cnt(1);
    obj_item_grp.set_item_unit_width("0px");
    obj_item_grp.set_json_txt(str_json);
}

/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    发送请求补充请求gamma,色域矫正,亮度控制
 * 参数:
 *    @param {Promise<Array>} box_name 箱体名称
 *    @param {Promise<Array>} box_list 箱体列表
 *    @param {Promise<String>} str_order 发送命令
 *    @param {Promise<boolean>} b_type 发送类型
 *    @param {Promise<string>} str_ctrl 主控芯片
 *    @param {Promise<Function>} fn_callback 回调函数
 *    @param {Promise<string>} str_workmode 镜像/群发
 * 返回：
 *    NA
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 李智明
 *      时间 : 2020.12.11
 *      内容 : 所有代码
 ************************************************************************************************/
function mc_main_send_supplenment(box_name, box_list, str_order, b_type, str_ctrl, fn_callback, str_workmode) {
    var ui_box_data = mc_main_get_data_idx_in_name(box_list, box_name);
    var obj_box_data = box_list[ui_box_data].data;
    var str_ctrlchip_name = obj_box_data.mc_util_get_ui_box_msg().ctrlchip_name;

    if (str_ctrl) {
        str_ctrlchip_name = str_ctrl;
    }
    var ary_gamma = obj_box_data.mc_util_get_gamma_val();
    var str_type = "RAM";

    if (!b_type) {
        str_type = "FLASH";
    }

    ary_gamma = 0 === ary_gamma.length ? [{ data: "" }] : ary_gamma;
    var str_gamma = ary_gamma[0].data;

    mc_sdk_hw_box_gama(1, str_order, str_gamma, str_ctrlchip_name, str_type, function () {
        mc_sdk_hw_box_gamut(1, str_order, g_obj_corr_rapid_data.b_gamut_switch, g_obj_corr_rapid_data.arr_tbl_data, str_ctrlchip_name, str_type, function () {
            mc_send_box_bright_date(1, str_order, g_str_show_light_data, str_ctrlchip_name, str_type, function () {
                fn_callback();
            }, str_workmode);
        }, str_workmode);
    }, str_workmode);
}


/************************************************************************************************
 * 类型:
 *    构造函数
 * 功能:
 *    构造侧边显示名称与模块源数据名称对应
 * 参数:
 *    NA
 * 返回:
 *    NA
 * 例子:
 *    NA
 * 备注:
 *     以下共用表示:
 *     1. type 数据类型; "MOD" === 模组 || "BOX" === 箱体 || "SCREEN" === 大屏
 * 修改:
 *    1. 类型 : 创建
 *       作者 : 巫昭雯
 *       时间 : 2020-12-23
 *       内容 : 所有代码
 *    1. 类型 : 添加
 *       作者 : 陈小荟
 *       时间 : 2021-01-09
 *       内容 : 大屏
 ************************************************************************************************/
function construct_side_and_block_name() {
    var m_obj_name_mod = {};
    var m_obj_name_box = {};
    var m_obj_name_screen = {};
    var str_mark_mod = "MOD";
    var str_mark_box = "BOX";
    var str_mark_screen = "SCREEN";

    /************************************************************************************************
     * 类型:
     *    函数
     * 功能:
     *    获取保存的数据对象
     * 参数:
     *    @param { Promise<String> } type 数据类型; "MOD" === 模组 || "BOX" === 箱体 || "SCREEN" === 大屏
     * 返回:
     *    @returns { Promise<Object> } 保存的对象 || false
     * 例子:
     *    NA
     * 备注:
     *    NA
     * 修改:
     *    1. 类型 : 创建
     *       作者 : 巫昭雯
     *       时间 : 2020-12-23
     *       内容 : 所有代码
     ************************************************************************************************/
    function get_obj_data(type) {
        switch (type) {
        case str_mark_mod:
            return m_obj_name_mod;
        case str_mark_box:
            return m_obj_name_box;
        case str_mark_screen:
            return m_obj_name_screen;
        default:
            return false;
        }
    }

    /************************************************************************************************
     * 类型:
     *    接口
     * 功能:
     *    设置显示名称
     * 参数:
     *    @param { Promise<String> } type 数据类型; "MOD" === 模组 || "BOX" === 箱体 || "SCREEN" === 大屏
     *    @param { Promise<String> } str_source_name 数据源名称; 等于全局保存的箱体 || 模组数据源名称
     *    @param { Promise<String> } str_show_name 侧边显示名称;
     * 返回:
     *    @returns { Promise<Boolean> } true === 设置成功 || false === 失败
     * 例子:
     *    NA
     * 备注:
     *    NA
     * 修改:
     *    1. 类型 : 创建1
     *       作者 : 巫昭雯
     *       时间 : 2020-12-23
     *       内容 : 所有代码
     ************************************************************************************************/
    this.set_name = function (type, str_source_name, str_show_name) {
        if ("string" !== typeof type || "string" !== typeof str_source_name || "string" !== typeof str_show_name) {
            return false;
        }

        if ("" === str_show_name.trim()) {
            return false;
        }

        var obj_data = get_obj_data(type);

        if (!obj_data) {
            return false;
        }

        obj_data[str_source_name] = str_show_name;

        return true;
    };


    /************************************************************************************************
     * 类型:
     *    接口
     * 功能:
     *    获取显示名称
     * 参数:
     *    @param { Promise<String> } type 数据类型; "MOD" === 模组 || "BOX" === 箱体 || "SCREEN" === 大屏
     *    @param { Promise<String> } name 数据源名称; 等于全局保存的箱体 || 模组数据源名称
     * 返回:
     *    @returns { Promise<String> } 返回显示的名称 || false === 失败
     * 例子:
     *    NA
     * 备注:
     *    NA
     * 修改:
     *    1. 类型 : 创建
     *       作者 : 巫昭雯
     *       时间 : 2020-12-23
     *       内容 : 所有代码
     ************************************************************************************************/
    this.get_name = function (type, name) {
        if ("string" !== typeof type || "string" !== typeof name) {
            return false;
        }

        var obj_data = get_obj_data(type);

        if (!obj_data) {
            return false;
        }

        var str = obj_data[name];

        if (!str) {
            return false;
        }

        return str;
    };
}


/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    更新模块显示名称当编辑框之后
 * 参数:
 *    @param { Promise<String> } type 数据类型; "MOD" === 模组 || "BOX" === 箱体
 *    @param { Promise<String> } idx 数据源下标
 *    @param { Promise<String> } val 新名称
 * 返回:
 *    NA
 * 例子:
 *    NA
 * 备注:
 *    NA
 * 修改:
 *    1. 类型 : 创建
 *       作者 : 巫昭雯
 *       时间 : 2020-12-24
 *       内容 : 所有代码
 *    2. 类型 : 添加
 *       作者 : 陈小荟
 *       时间 : 2021-01-09
 *       内容 : 所有代码
 ************************************************************************************************/
function update_show_name_when_side_edit(type, idx, val) {
    if ("string" !== typeof type || "string" !== typeof val) {
        return;
    }

    // 数据源
    var arr_data = [];

    switch (type.toLocaleUpperCase()) {
    case "BOX":
        arr_data = ARY_BOX_DATA;
        break;
    case "MOD":
        arr_data = ARY_MOD_DATA;
        break;
    case "SCREEN":
        arr_data = ARY_SCREEN_DATA;
        break;
    default:
        break;
    }

    var obj_data = arr_data[idx];

    if (obj_data) {
        var str_source_name = obj_data.name;
        var obj_iframe = document.getElementById("iframe_content_subpage").contentWindow;
        var fun_name = obj_iframe.update_show_name_val;

        g_obj_side_name.set_name(type, str_source_name, val);

        if ("function" === typeof fun_name) {
            fun_name(str_source_name, val);
        }

        if (obj_iframe.g_obj_page_popup_link) {
            var fun_name_link = obj_iframe.g_obj_page_popup_link.link_data;

            if ("function" === typeof fun_name_link) {
                obj_iframe.g_obj_page_popup_link.link_data("modify", [str_source_name, val]);
            }
        }
    }
}


/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    更新添加弹窗显示名称
 * 参数:
 *    @param { Promise<String> } obj_page 弹窗页面window对象；
 *    @param { Promise<String> } arr_param 参数数组[数据源名称, 显示名称]
 * 返回:
 *    NA
 * 例子:
 *    NA
 * 备注:
 *    NA
 * 修改:
 *    1. 类型 : 创建
 *       作者 : 巫昭雯
 *       时间 : 2020-12-29
 *       内容 : 所有代码
 ************************************************************************************************/
function mc_update_add_page_popup_show_name(obj_page, arr_param) {
    if ("function" === typeof obj_page.mc_update_block_show_name_val) {
        obj_page.mc_update_block_show_name_val(arr_param[0], arr_param[1]);
    }
}

// main页面按键事件
document.onkeydown = function (eve) {
    var e = eve || window.event;

    // ctrl + l
    if (e.ctrlKey && 76 === e.keyCode) {
        var ary_log_list = g_obj_log.get_log_txt();

        if (0 < ary_log_list.length) {
            var str_val = "";

            ary_log_list.forEach(function (value) {
                if (value) {
                    str_val += value + "<br/>";
                }
            });
            var str_html = "<div style=\"height:100%; overflow: auto;\">" + str_val + "</div>";

            layer.alert(str_html);
        }
    }
};


// ********************************************************************* 编辑图标按钮 ********************************************************************* //
/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    初始化图标按钮编辑页布局
 * 参数:
 *    @param { Promise<String> } m_obj mc_construct_icon_btn 实例对象
 *    @param { Promise<String> } id 装载编辑布局的外部容器id
 * 返回:
 *    @returns { Promise<Boolean> } false === 参数错误
 * 例子:
 *    NA
 * 备注:
 *    NA
 * 修改:
 *    1. 类型 : 创建
 *       作者 : 巫昭雯
 *       时间 : 2021-04-25
 *       内容 : 所有代码
 ************************************************************************************************/
function init_ibtn_edit_layout(m_obj, id) {
    if ("object" !== typeof m_obj || m_obj.constructor !== mc_construct_icon_btn) {
        return false;
    }

    // var m_obj = new mc_construct_icon_btn();
    var str_json = mc_constrcut_icon_btn_json();

    m_obj.set_all(str_json);
    m_obj.open(id);
    mc_open_icon_btn_all(id);

    return true;
}


/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    构造所有图标按钮json串
 * 参数:
 *    NA
 * 返回:
 *    @returns { Promise<String> } json 字符串
 * 例子:
 *    NA
 * 备注:
 *    NA
 * 修改:
 *    1. 类型 : 创建
 *       作者 : 巫昭雯
 *       时间 : 2021-04-25
 *       内容 : 所有代码
 ************************************************************************************************/
function mc_constrcut_icon_btn_json() {
    var obj_sdk_param = new mc_sdk_param();

    obj_sdk_param.set_cmd("ICON_BTN");

    // 注册图标
    // 快捷

    // side btn top : mod box screen
    set_param("MC_LANG_MOD", "icon-mod", "", true, "mc_side_btn_mod_wizard");
    set_param("MC_LANG_BOX", "icon-box-connect", "", true, "mc_side_btn_box");
    set_param("MC_LANG_SCREEN", "icon-screen-connect", "", true, "mc_side_head_btn");

    // 底部的快捷
    set_param("MC_LANG_LOAD_CALCULATION", "icon-on_load_frequency", "on_clk_load_calculation", true, "mc_side_hub");
    set_param("MC_LANG_ONLINE_CORRECT", "icon-rectify", "on_clk_correct", true, "mc_side_hub");
    set_param("MC_LANG_FUNKCARD_TITLE", "icon-funk-card", "on_clk_environment", true, "");
    set_param("MC_LANG_GAMMA", "icon-gamma", "on_clk_gamma_cfg", true, "mc_side_gamma");
    set_param("MC_LANG_CHIP_SHOW_CONTROL", "icon-chip-coontrol", "on_clk_mode_bright", true, "mc_side_bright");
    set_param("MC_LANG_CONNECT_CARD", "icon-send-hub", "on_clk_connect_card", true, "");
    set_param("MC_LANG_ONLINE_UPGRADE", "icon-rom ", "on_clk_upgrade", true, "");
    set_param("MC_LANG_PLUG", "icon-setting-tools", "mc_start_testtool", true, "mc_hardware_write");
    set_param("MC_LANG_RESOLUTION", "icon-reso_ratio", "mc_open_dvi_cfg", true, "");
    set_param("MC_LANG_MONITOR", "icon-v2-monitor", "mc_open_monitor", true);

    // 未使用的
    // set_param("卡版本", "icon-card-version", "mc_open_card_version", true , "mc_hardware_write" );
    // set_param("3", "icon-screen-load", "", true , "mc_hardware_write" );
    // set_param("4", "icon-screen-load", "", true , "mc_hardware_write" );
    // set_param("5", "icon-screen-load", "", true , "mc_hardware_write" );
    // set_param("6", "icon-screen-load", "", true , "mc_hardware_write" );
    // set_param("7", "icon-screen-load", "", true , "mc_hardware_write" );


    /************************************************************************************************
     * 类型:
     *    内置函数
     * 功能:
     *    设置json串项
     * 参数:
     *    @param { Promise<String> } key 图标key; 值为lang_id值 (必须)
     *    @param { Promise<String> } icon 图标样式类;
     *    @param { Promise<String> } fn 图标按钮调用函数名称
     *    @param { Promise<Boolean> } use 是否使用; 表示为快捷使用; true === 使用 || false === 未使用
     *    @param { Promise<String> } dom_id 生成为侧边按钮时的dom id
     * 返回:
     *    NA
     * 例子:
     *    NA
     * 备注:
     *    NA
     * 修改:
     *    1. 类型 : 创建
     *       作者 : 巫昭雯
     *       时间 : 2021-04-26
     *       内容 : 所有代码
     *    1. 类型 : 添加
     *       作者 : 巫昭雯
     *       时间 : 2021-05-31
     *       内容 : 添加侧边上方按钮 "模组","箱体", "大屏"判断;
     ************************************************************************************************/
    function set_param(key, icon, fn, use, dom_id) {
        if ("string" !== typeof key || !key.trim()) {
            return;
        }
        key = key.trim();
        obj_sdk_param.set_param_value(key, "");
        obj_sdk_param.set_attr_val(key, "ICON", icon);
        obj_sdk_param.set_attr_val(key, "FN", fn);
        obj_sdk_param.set_attr_val(key, "USE", true === use ? "true" : "false");
        obj_sdk_param.set_attr_val(key, "DOM_ID", dom_id);

        if ("MC_LANG_MOD" === key || "MC_LANG_BOX" === key || "MC_LANG_SCREEN" === key) {
            obj_sdk_param.set_attr_val(key, "MARK", "SIDE_TOP");
        }
    }

    return obj_sdk_param.get_json();
}


/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    侧边 "全部" 按钮点击,打开图标按钮编辑块; 切换显示;
 * 参数:
 *    @param { Promise<String> } id 装载编辑布局的外部容器id
 * 返回:
 *    NA
 * 例子:
 *    NA
 * 备注:
 *    NA
 * 修改:
 *    1. 类型 : 创建
 *       作者 : 巫昭雯
 *       时间 : 2021-04-25
 *       内容 : 所有代码
 ************************************************************************************************/
function mc_open_icon_btn_all(id) {
    var o_el = document.getElementById(id);

    if (o_el) {
        var o_show = {
            width: "80%",
            display: "block"
        };
        var o_hide = {
            width: "0px",
            display: "none"
        };

        var b = "false" === o_el.getAttribute("b_swich") ? false : true;
        var val = b ? o_show : o_hide;

        // switch
        b = !b;

        o_el.setAttribute("b_swich", b);

        // 切换显示
        $(o_el).animate(val).css(val);

        if (b) {
            // 关闭
            g_obj_icon_btn.close();
            var html = mc_get_side_btn_html(g_obj_icon_btn.get_shortcut());

            mc_construct_side_btn_layout(html);
        } else {
            if (g_obj_side_icon_text && g_obj_side_icon_text.set_display) {
                g_obj_side_icon_text.set_display(false);
            }
        }
    }
}


/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    获取侧边按钮html; 快捷;
 * 参数:
 *    @param { Promise<Array> } arr 按钮数据;
//  *    @param { Promise<String> } str_dir 文字布局方向,相对与btn; 参考备注
 *    @param { Promise<Boolean> } b_bottom_btn 是否只需要底部按钮文字; 只需要底部时不处理侧边顶部按钮样式
 * 返回:
 *    @returns { Promise<String> } 按钮字符串 || false
 * 例子:
 *    NA
 * 备注:
 *    数组内对象 {
 *    {
 *        "name_id": 标签翻译name_id,
 *        "dom_id": 标签id,
 *        "icon": 标签图标类,
 *        "fn": 标签点击触发函数,
 *        "idx": 排序; 默认与数组下标一致
 *    }
 *    str_dir 参数解释:
 *    I === inner (在按钮内部;)
 * 修改:
 *    1. 类型 : 创建
 *       作者 : 巫昭雯
 *       时间 : 2021-04-25
 *       内容 : 所有代码
 ************************************************************************************************/
function mc_get_side_btn_html(arr, b_bottom_btn) {
    // console.log(arr);
    if ("object" !== typeof arr) {
        return false;
    }


    var ui_len = arr.length;
    var ui_show_cont = 100;
    var ui_num = 0;
    var html = "";
    var obj_side_top = {
        "mc_side_btn_mod_wizard": false,
        "mc_side_btn_box": false,
        "mc_side_head_btn": false
    };

    if (0 === ui_len) {
        switch_side_btn_top();
        return "";
    }

    for (var idx = 0; idx < ui_len; idx++) {
        var item = arr[idx];


        if (item) {
            var str_name_id = item.name_id;

            if (Object.prototype.hasOwnProperty.call(obj_side_top, item.dom_id)) {
                obj_side_top[item.dom_id] = true;
                continue;
            }

            if (ui_show_cont === ui_num) {
                break;
            }

            ui_num++;
            var str = "";

            if (true === b_bottom_btn) {
                str = "<div class='mc_side_shortcut_text_item ' onclick=''>" + "<div id='" + item.dom_id + "' class='icon_btn side_fontw " + item.icon + "' lang_id='" + str_name_id + " 'title='" + str_name_id + "' onclick='" + item.fn + "(this)'>" + "</div>" +
                    "<div class='side_btn_text' lang_id='" + str_name_id + "' control_type='side_btn'>" + str_name_id + "</div>" + "</div>";
            } else {
                str = "<div id='" + item.dom_id + "' class='side_fontw " + item.icon + "' lang_id='" + str_name_id + " 'title='" + str_name_id + "' onclick='" + item.fn + "(this)'>" +
                    "<div lang_id='" + str_name_id + "' control_type='side_btn'>" + str_name_id + "</div>" + "</div>";
            }

            html += str;
        }
    }

    switch_side_btn_top();
    /************************************************************************************************
     * 类型:
     *    内置函数
     * 功能:
     *    快捷; 切换侧边顶部的按钮显示;
     * 参数:
     *    NA
     * 返回:
     *    NA
     * 例子:
     *    NA
     * 备注:
     *    NA
     * 修改:
     *    1. 类型 : 创建
     *       作者 : 巫昭雯
     *       时间 : 2021-05-31
     *       内容 : 所有代码
     ************************************************************************************************/
    function switch_side_btn_top() {
        // deal side top
        if (true === b_bottom_btn) {
            return;
        }

        var ui_i = 0;
        var arr_obj = Object.keys(obj_side_top);

        while (ui_i < arr_obj.length) {
            var str_id = arr_obj[ui_i];

            if (true === obj_side_top[str_id]) {
                document.getElementById(str_id).style.display = "block";
            } else {
                document.getElementById(str_id).style.display = "none";
            }
            ui_i++;
        }
    }

    return html;
}


/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    点击图标按钮编辑 外部 关闭编辑块;
 * 参数:
 *    @param { Promise<String> } e 点击事件 event
 *    @param { Promise<String> } id 装载编辑布局的外部容器id
 *    @param { Promise<String> } id_all 打开编辑块的按钮id
 * 返回:
 *    NA
 * 例子:
 *    NA
 * 备注:
 *    NA
 * 修改:
 *    1. 类型 : 创建
 *       作者 : 巫昭雯
 *       时间 : 2021-04-25
 *       内容 : 所有代码
 ************************************************************************************************/
function click_out_close_ibtn_edit(e, id, id_all) {
    if (!e && document.getElementById(id_all)) {
        return;
    }

    var el = document.getElementById(id);

    if (el && id_all !== e.target.id && 0 === $(e.target).parents("#" + id).length) {
        if ("none" !== el.style.display) {
            // console.log(e);
            mc_open_icon_btn_all(id);
        }
    }
}


/*****************************************侧栏项拖拽添加**********************************************/
var obj_mov = {};
var obj_base_pnt = {};
var obj_draw_boundary = {};
var b_draw_add = false;

/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    清空拖拽参数
 * 参数:
 *     无
 * 返回：
 *    @return { Promise<Boolean> }
 *     true 清空
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 陈小荟
 *      时间 : 2021.04.30
 *      内容 : 所有代码
 ************************************************************************************************/
function clear_mov_param() {
    if (obj_mov.OBJ) {
        obj_mov.OBJ.style.display = "none";
    }
    obj_base_pnt = {};
    obj_mov = {};
    obj_draw_boundary = {};
    b_draw_add = false;
    return true;
}

/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    侧栏项 鼠标点击事件
 *    符合条件进行拖拽添加
 * 备注(条件):
 *     1. 大屏页面打开,选中侧栏箱体项 || 箱体页面打开,选中侧栏模组项
 *     2. 拖动范围X || Y 方向大于10
 * 参数:
 *     @param { Promise<Object> } eve 事件对象
 *     @param { Promise<Object> } obj 当前点击元素对象
 * 返回：
 *    @return { Promise<Boolean> }
 *     true
 *     false 参数错误
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 陈小荟
 *      时间 : 2021.04.30
 *      内容 : 所有代码
 ************************************************************************************************/
function mc_sideitem_mousedown(eve, obj) {
    // 非选中项退出
    if (!$(obj).hasClass("select_side_item")) {
        return false;
    }
    // clearBubble();
    var eve_mousedown = eve || window.event;

    mc_call_child_fn("mc_side_draw_data", false, function (obj_data) {
        if (!obj_data) {
            return false;
        }
        var b_add_screen = obj_data.b_add_screen;
        var ui_box_scale = Number(obj_data.ui_box_scale) / 100 * 26;
        var arr_size = [];
        var obj_side_data = null;

        if (b_add_screen) {
            // 对应侧栏是否显示
            if ("none" === document.getElementsByClassName("mc_side_box")[0].style.display) {
                return false;
            }
            obj_side_data = ARY_SIDE_BOX_DATA[ui_box_cur_page];

            if (obj_side_data) {
                arr_size = [Number(obj_side_data.width) * ui_box_scale, Number(obj_side_data.height) * ui_box_scale];
            }
        } else {
            if ("none" === document.getElementsByClassName("mc_side_mod")[0].style.display) {
                return false;
            }
            obj_side_data = ARY_SIDE_MOD_DATA[ui_mod_cur_page];

            if (obj_side_data) {
                arr_size = [Number(obj_side_data.width) * ui_box_scale, Number(obj_side_data.height) * ui_box_scale];
            }
        }

        if (0 === arr_size.length) {
            return false;
        }

        b_draw_add = true;
        // 大屏/箱体界面开启状态 && 当前项选中
        obj_base_pnt = mc_get_pnt(eve_mousedown);
        obj_base_pnt.ui_box_scale = ui_box_scale;
        var obj_blk_move = document.getElementById("mc_blk_move");
        var ui_blk_mov_w = arr_size[0];
        var ui_blk_mov_h = arr_size[1];
        var ui_x = obj_base_pnt.X - arr_size[0] / 2;
        var ui_y = obj_base_pnt.Y - arr_size[1] / 2;
        var ui_blk_size = 64 * ui_box_scale;

        obj_mov = { OBJ: obj_blk_move, X: ui_x, Y: ui_y, W: ui_blk_mov_w, H: ui_blk_mov_h, W_GRID: obj_side_data.width, H_GRID: obj_side_data.height };
        obj_draw_boundary = { X: document.body.offsetWidth - ui_blk_mov_w, Y: document.body.offsetHeight - ui_blk_mov_h };
        // obj_blk_move.style.width = arr_size[0] + "px";
        // obj_blk_move.style.height = arr_size[1] + "px";
        obj_blk_move.style.width = ui_blk_size + "px";
        obj_blk_move.style.height = ui_blk_size + "px";
        // eve_mousedown.preventDefault();
        return true;
    });
    return true;
}

if (B_ISTOUCH) {
    window.onmousemove = function (e) {
        mc_sideitem_mousemove(e);
        return true;
    };

    window.onmouseup = function () {
        mc_sideitem_mouseup();
        return true;
    };
} else {
    window.addEventListener("touchmove", function (e) {
        mc_sideitem_mousemove(e);
    }, { passive: false });
    window.addEventListener("touchend", function () {
        mc_sideitem_mouseup();
    }, { passive: false });
}


function mc_sideitem_mousemove(e) {
    if (!b_draw_add) {
        return false;
    }
    // clearBubble();
    var eve_mousemove = e || window.event;
    var obj_new_pnt = mc_get_pnt(eve_mousemove);
    // 移动距离
    var ui_x = obj_mov.X + obj_new_pnt.X - obj_base_pnt.X;
    var ui_y = obj_mov.Y + obj_new_pnt.Y - obj_base_pnt.Y;

    // 边界处理
    ui_x = 0 > ui_x ? 0 : ui_x = (obj_draw_boundary.X < ui_x ? obj_draw_boundary.X : ui_x);
    ui_y = 0 > ui_y ? 0 : ui_y = (obj_draw_boundary.Y < ui_y ? obj_draw_boundary.Y : ui_y);

    if (10 < Math.abs(obj_base_pnt.X - obj_new_pnt.X) || 10 < Math.abs(obj_base_pnt.Y - obj_new_pnt.Y)) {
        obj_mov.OBJ.style.display = "block";
    }

    obj_mov.OBJ.style.left = ui_x + "px";
    obj_mov.OBJ.style.top = ui_y + "px";
    eve_mousemove.preventDefault();
    return false;
}

function mc_sideitem_mouseup() {
    if (!b_draw_add) {
        return false;
    }
    if ("none" === obj_mov.OBJ.style.display) {
        return false;
    }
    // clearBubble();

    // 即将创建
    var ui_x = obj_mov.OBJ.offsetLeft;
    var ui_y = obj_mov.OBJ.offsetTop;
    var ui_side_lan_w = document.getElementById("mc_side_right_box").offsetWidth;
    var ui_side_w = document.getElementById("mc_wrap_div_side_cont").offsetWidth + ui_side_lan_w;
    var ui_title_h = document.getElementById("page_title").offsetHeight;

    mc_call_child_fn("mc_get_box_boundrect", false, function (data) {
        if (!data) {
            clear_mov_param();
            return false;
        }

        if ($("#mc_side_fix").hasClass("select_side_item")) {
            // 侧栏固定
            ui_x = ui_x - ui_side_w - data.X;
        } else {
            ui_x = ui_x - ui_side_lan_w - data.X;
        }
        ui_y = ui_y - ui_title_h - data.Y;
        if (0 < ui_x && 0 < ui_y) {
            // cancel select
            mc_call_child_fn("mc_lang_deselect_mod", false, function () { });
            mc_call_child_fn("mc_side_draw_creat", {
                b_clear_box: false,
                b_clear_new: false,
                col: 1,
                row: 1,
                height: obj_mov.H_GRID,
                width: obj_mov.W_GRID,
                left: Math.round(ui_x / obj_base_pnt.ui_box_scale),
                top: Math.round(ui_y / obj_base_pnt.ui_box_scale)
            }, function () { });
        }
        clear_mov_param();
        return true;
    });
    return true;
}

/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    调用子页面函数
 * 参数:
 *     @param { Promise<Function> } fun_name 函数名
 *     @param { Promise<Any> } param 传递参数 可为空
 *     @param { Promise<Function> } fn_callback 回调函数
 * 返回：
 *    @return { Promise<Boolean> }
 *     true
 *     false 参数错误
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 陈小荟
 *      时间 : 2020.04.30
 *      内容 : 所有代码
 ************************************************************************************************/
function mc_call_child_fn(fun_name, param, fn_callback) {
    if ("[object String]" !== Object.prototype.toString.call(fun_name)) {
        fn_callback(null);
        return false;
    }
    if ("[object Function]" !== Object.prototype.toString.call(fn_callback)) {
        fn_callback(null);
        return false;
    }
    var elem_iframe = document.getElementsByTagName("iframe");

    for (var idx = 0; idx < elem_iframe.length; idx++) {
        var child_fn = elem_iframe[idx].contentWindow[fun_name];

        if (child_fn) {
            child_fn(param, fn_callback);
        } else {
            fn_callback(null);
        }
    }
    return true;
}

/*****************************************发送卡数据记录**********************************************/
/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    发送卡列表数据
 *    1. 获取当前发送卡索引号
 *    2. 更改发送卡名称
 *    3. 切换发送卡连接状态
 * 参数:
 *     NA
 * 返回：
 *    无
 * 修改:
 *   1. 类型 : 创建
 *      作者 : 陈小荟
 *      时间 : 2021.06.04
 *      内容 : 所有代码
 ************************************************************************************************/
function mc_sendcard_data() {
    var ary_sendcard_name = [];
    // 发送卡当前索引 从0开始
    var ui_current_index = -1;
    // 当前选中卡id
    var str_current_id = "";

    // 保存数据 发送卡数据、接收卡数量
    this.set_data = function (arr_sendcard_name, arr_recvcard_list) {
        if ("[object Array]" === Object.prototype.toString.call(arr_sendcard_name) && 0 !== arr_sendcard_name.length) {
            ary_sendcard_name = arr_sendcard_name;
            if ("[object Array]" === Object.prototype.toString.call(arr_recvcard_list)) {
                for (var i = 0; i < arr_recvcard_list.length; i++) {
                    ary_sendcard_name[i].recvcard_idx = arr_recvcard_list[i];
                }
            }
        } else {
            this.set_param_clear();
        }
        return;
    };

    // 获取发送卡状态字串 旧状态字串
    this.get_sendcard_state = function () {
        // 硬件未连接
        if (0 === ary_sendcard_name.length) {
            return "[NA]";
        }
        // 判断卡是否被拔出 未拔出条件：索引及卡名称正确对应
        if (-1 !== ui_current_index && 0 !== str_current_id.length &&
            ary_sendcard_name[ui_current_index] && ary_sendcard_name[ui_current_index].id === str_current_id) {
            return "";
        }
        // 未显示数据/卡被拔出 -> 显示第一张发送卡
        if (-1 === ui_current_index) {
            return this.switch_current_card(0);
        }
        return this.switch_current_card(ui_current_index);
    };

    // 修改卡名称
    // 卡索引 卡名称
    this.set_current_card = function (ui_index, str_name) {
        if ("[object Number]" !== Object.prototype.toString.call(ui_index)) {
            return false;
        }
        if ("[object String]" !== Object.prototype.toString.call(str_name)) {
            return false;
        }

        if (ary_sendcard_name[ui_index]) {
            ary_sendcard_name[ui_index].name = str_name;
        }
        return true;
    };

    // 切换卡 卡索引
    this.switch_current_card = function (ui_idx) {
        var str_status = "[NA]";

        if ("[object Number]" !== Object.prototype.toString.call(ui_idx)) {
            return str_status;
        }
        var obj_data = ary_sendcard_name[ui_idx];

        if (obj_data) {
            str_status = "[" + (ui_idx + 1) + "/" + ary_sendcard_name.length + ":" + obj_data.name + "]";
            ui_current_index = ui_idx;
            str_current_id = obj_data.id;
            $("#sencard_state").text(str_status);
        }
        return str_status;
    };

    // 获取当前发送卡索引号
    this.get_current_sendcard_param = function () {
        return ui_current_index;
    };

    // 获取发送卡列表
    this.get_sendcard_list = function () {
        return ary_sendcard_name;
    };

    // 初始化参数
    this.set_param_clear = function () {
        ary_sendcard_name = [];
        ui_current_index = -1;
        str_current_id = "";
        return;
    };
}

/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    初始化侧边事件; 包括打开侧边编辑的快捷键方式
 * 参数:
 *    NA
 * 返回:
 *    NA
 * 例子:
 *    NA
 * 备注:
 *    NA
 * 修改:
 *    1. 类型 : 创建
 *       作者 : 巫昭雯
 *       时间 : 2021-05-31
 *       内容 : 所有代码
 *    1. 类型 : 添加
 *       作者 : 巫昭雯
 *       时间 : 2021-06-02
 *       内容 : 添加移动端侧边长按事件;
 ************************************************************************************************/
function mc_main_init_side_event() {
    // mc_side_right_box
    var obj_side = document.getElementById("mc_side_right_box");
    var obj_menu = document.getElementById("mc_side_menu");
    var obj_btn_edit = document.getElementById("mc_container_edit_ibtn");

    if (!obj_side || !obj_menu || !obj_btn_edit) {
        return;
    }

    obj_menu.onclick = mc_side_click_menu;
    obj_menu.ontouchstart = mc_side_click_menu;

    // 点击右击打开的菜单
    function mc_side_click_menu(event) {
        obj_menu.style.display = "none";
        mc_open_icon_btn_all("mc_container_edit_ibtn");
        event.stopPropagation();
        event.preventDefault();
    }

    obj_side.oncontextmenu = mc_side_btn_oncontextmenu;
    obj_btn_edit.oncontextmenu = mc_side_btn_oncontextmenu;

    /************************************************************************************************
     * 类型:
     *    内置函数
     * 功能:
     *    侧边右击打开自定义事件
     * 参数:
     *     @param { Promise<Object> } e 鼠标右击事件 event
     * 返回:
     *    NA
     * 例子:
     *    NA
     * 备注:
     *    NA
     * 修改:
     *    1. 类型 : 创建
     *       作者 : 巫昭雯
     *       时间 : 2021-05-31
     *       内容 : 所有代码
     ************************************************************************************************/
    function mc_side_btn_oncontextmenu(e) {
        // console.log("[oncontextmenu]");

        if ("none" === document.getElementById("mc_container_edit_ibtn").style.display) {
            $(obj_menu).children("#mc_side_menu_text").html(obj_lang_map.MC_LANG_ICON_BTN_OPEN_EDIT);
        } else {
            $(obj_menu).children("#mc_side_menu_text").html(obj_lang_map.MC_LANG_ICON_BTN_CLOSE_EDIT);
        }

        var ui_l = e.clientX + 10;
        var ui_t = e.clientY + 10;

        obj_menu.style.display = "block";
        obj_menu.style.left = ui_l + "px";
        obj_menu.style.top = ui_t + "px";
        e.preventDefault();
    }


    // 移动端长按事件
    init_long_press_event();
    function init_long_press_event() {
        var g_obj_mobile_press = new mc_side_long_press_event(function (e) {
            mc_side_btn_oncontextmenu(e);
        });

        if (Object.keys(g_obj_mobile_press).length) {
            g_obj_mobile_press.set_container("mc_side_right_box");
        }
    }

    /************************************************************************************************
     * 类型:
     *    内置函数
     * 功能:
     *    侧边长按事件
     * 参数:
     *    @param { Promise<Function> } callback 执行该事件完成回调; 参数为事件event
     * 返回:
     *    NA
     * 例子:
     *    NA
     * 备注:
     *    NA
     * 修改:
     *    1. 类型 : 创建
     *       作者 : 巫昭雯
     *       时间 : 2021-06-02
     *       内容 : 所有代码
     ************************************************************************************************/
    function mc_side_long_press_event(callback) {
        if (mc_istouch() || "function" !== typeof callback) {
            return;
        }

        var m_fn_done = callback;
        var m_str_id = "";
        var m_ui_timer = null;

        this.set_container = function (str_id) {
            if ("string" !== typeof str_id) {
                return;
            }
            m_str_id = str_id;
            this.init();
        };

        this.init = function () {
            var obj_container = document.getElementById(m_str_id);

            if (!obj_container) {
                return;
            }

            // 位置值偏差
            var obj_pos = {
                start: function (e) {
                    var obj_e = e.changedTouches[0];

                    this.ui_x = obj_e.clientX;
                    this.ui_y = obj_e.clientY;
                },
                move: function (e) {
                    var obj_e = e.changedTouches[0];
                    var ui_move_x = Math.abs(obj_e.clientX - this.ui_x);
                    var ui_move_y = Math.abs(obj_e.clientY - this.ui_y);

                    if (8 < ui_move_x || 8 < ui_move_y) {
                        return true;
                    }

                    return false;
                }
            };

            init_touch();
            function init_touch() {
                obj_container.ontouchstart = function (e) {
                    if (!is_executable_area(e.target)) {
                        e.stopPropagation();
                        return;
                    }

                    e.preventDefault();
                    obj_pos.start(e);
                    clearTimeout(m_ui_timer);
                    m_ui_timer = setTimeout(function () {
                        if (null !== m_ui_timer) {
                            m_ui_timer = true;
                            do_after_press(e);
                        }
                    }, 600);
                };

                obj_container.ontouchmove = function (e) {
                    if (obj_pos.move(e)) {
                        clearTimeout(m_ui_timer);
                        return;
                    }
                };

                obj_container.ontouchend = function (e) {
                    if (!is_executable_area(e.target)) {
                        return;
                    }

                    clearTimeout(m_ui_timer);

                    if (true === m_ui_timer) {
                        return;
                    }

                    window.dispatchEvent(new MouseEvent("click"));
                };
            }

            // 执行长按后续事件
            function do_after_press(e) {
                var ev = e || window.event;

                ev.clientX = e.changedTouches[0].clientX;
                ev.clientY = e.changedTouches[0].clientY;
                m_fn_done(ev);
            }

            // 是否为可执行区域; 侧边顶部按钮和底部按钮之外的区域可执行
            function is_executable_area(o_target) {
                if ($(o_target).parents(".mc_side_shortcut").length) {
                    return false;
                }

                if ($(o_target).parents(".mc_side_top").length) {
                    return false;
                }

                if ("mc_side_btn_open_icon_text" === o_target.id) {
                    return false;
                }

                return true;
            }
        };
    }
}


/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    初始化构造侧边按钮展开文本布局
 * 参数:
 *    @param { Promise<String> } str_id 容器id
 *    @param { Promise<String> } str_btn_id 切换容器显示的按钮id
 * 返回:
 *    @returns { Promise<String> } 参数1
 * 例子:
 *    NA
 * 备注:
 *    NA
 * 修改:
 *    1. 类型 : 创建
 *       作者 : 巫昭雯
 *       时间 : 2021-06-02
 *       内容 : 所有代码
 ************************************************************************************************/
function mc_main_init_side_unfold_text(str_id) {
    if ("string" !== typeof str_id) {
        return false;
    }
    var obj_container = document.getElementById(str_id);

    if (!obj_container) {
        return false;
    }

    // switch_btn_id
    // var obj_switch_btn = document.getElementById(obj_container.getAttribute("switch_btn_id"));

    // 操作对象
    var m_obj_operation = {
        b_display: false,
        set_display: function (b) {
            if (b) {
                obj_container.style.display = "block";
                this.b_display = true;
            } else {
                obj_container.style.display = "none";
                this.b_display = false;
            }
        },
        switch_show: function () {
            if (this.b_display) {
                this.set_display(false);
            } else {
                this.set_display(true);
            }
        },
        update: function () {
            var str = mc_get_side_btn_html(g_obj_icon_btn.get_shortcut(), true);

            obj_container.innerHTML = str;
        }
    };

    var str = mc_get_side_btn_html(g_obj_icon_btn.get_shortcut(), true);

    obj_container.innerHTML = str;
    obj_container.onclick = function (e) {
        e = e || window.event;
        var o_target = e.target;

        if ($(o_target).hasClass("icon_btn")) {
            return;
        }

        var $o_btn = null;

        try {
            if ($(o_target).hasClass("mc_side_shortcut_text_item")) {
                $o_btn = $(o_target).children(".icon_btn");
            } else {
                $o_btn = $(o_target).parents(".mc_side_shortcut_text_item").children(".icon_btn");
            }

            $o_btn[0].click();
        } catch (error) { } // eslint-disable-line

        m_obj_operation.set_display(false);
    };


    return m_obj_operation;
}


/************************************************************************************************
 * 类型:
 *    函数
 * 功能:
 *    侧边文件加载 onchange
 * 参数:
 *    @param { Promise<Object> } dom input 对象
 * 返回:
 *    NA
 * 例子:
 *    NA
 * 备注:
 *    NA
 * 修改:
 *    1. 类型 : 创建
 *       作者 : 巫昭雯
 *       时间 : 2021-06-08
 *       内容 : 所有代码
 ************************************************************************************************/
function mc_side_load_file_chg(dom) {
    if (dom && dom.getAttribute("file_type")) {
        switch (dom.getAttribute("file_type").trim().toLocaleUpperCase()) {
        case "BOX":
            mc_load_box_file(dom);
            break;
        case "SCREEN":
            mc_load_screen_file(dom);
            break;
        default:
            break;
        }
    }
}
